[.net] JObject를 .NET 객체로 직렬화 해제하는 방법
나는 행복하게 Newtonsoft JSON 라이브러리를 사용합니다 . 예를 들어, JObject
.NET 객체에서이 인스턴스를 작성합니다 ( 이 경우 Exception 인스턴스 (하위 클래스이거나 아닐 수 있음)).
if (result is Exception)
var jobjectInstance = JObject.FromObject(result);
이제 라이브러리가 JSON 텍스트 (예 : 문자열)를 객체로 직렬화 해제 할 수 있음을 알고 있습니다.
// only works for text (string)
Exception exception = JsonConvert.DeserializeObject<Exception>(jsontext);
그러나 내가 찾고있는 것은 :
// now i do already have an JObject instance
Exception exception = jobjectInstance.????
글쎄, JObject
JSON 텍스트로 돌아가서 deserialize 기능을 사용할 수 있다는 것이 분명 하지만 나에게는 거꾸로 보입니다.
답변
이 게시물 에 따르면 지금은 훨씬 낫습니다.
// pick out one album
JObject jalbum = albums[0] as JObject;
// Copy to a static Album instance
Album album = jalbum.ToObject<Album>();
설명서 : JSON을 형식으로 변환
답변
내가 찾은 문서에서
JObject o = new JObject(
new JProperty("Name", "John Smith"),
new JProperty("BirthDate", new DateTime(1983, 3, 20))
);
JsonSerializer serializer = new JsonSerializer();
Person p = (Person)serializer.Deserialize(new JTokenReader(o), typeof(Person));
Console.WriteLine(p.Name);
의 클래스 정의 Person
는 다음과 호환되어야합니다.
class Person {
public string Name { get; internal set; }
public DateTime BirthDate { get; internal set; }
}
편집하다
최신 버전의 JSON.net을 사용 하고 있고 사용자 지정 직렬화가 필요하지 않은 경우 TienDo의 답변을 위 또는 아래의 경우 : P)를 참조하십시오.
답변
누군가가 다른 방법을 찾고있는 경우를 대비하여 너무 늦었습니다.
void Main()
{
string jsonString = @"{
'Stores': [
'Lambton Quay',
'Willis Street'
],
'Manufacturers': [
{
'Name': 'Acme Co',
'Products': [
{
'Name': 'Anvil',
'Price': 50
}
]
},
{
'Name': 'Contoso',
'Products': [
{
'Name': 'Elbow Grease',
'Price': 99.95
},
{
'Name': 'Headlight Fluid',
'Price': 4
}
]
}
]
}";
Product product = new Product();
//Serializing to Object
Product obj = JObject.Parse(jsonString).SelectToken("$.Manufacturers[?(@.Name == 'Acme Co' && @.Name != 'Contoso')]").ToObject<Product>();
Console.WriteLine(obj);
}
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
}