JObject를 .NET 객체로 직렬화 해제하는 방법


241

나는 행복하게 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.????

글쎄, JObjectJSON 텍스트로 돌아가서 deserialize 기능을 사용할 수 있다는 것이 분명 하지만 나에게는 거꾸로 보입니다.

답변:


489

게시물 에 따르면 지금은 훨씬 낫습니다.

// pick out one album
JObject jalbum = albums[0] as JObject;

// Copy to a static Album instance
Album album = jalbum.ToObject<Album>();

설명서 : JSON을 형식으로 변환


10
성능에 대한 아이디어가 있습니까? 매번 반사가 사용됩니까?
Shaun Rowan

1
사용자 정의 JsonConverter 로이 작업을 수행 할 수 있습니까?
Justin Skiles

3
힌트 주셔서 감사합니다. 그것은 많은 도움이되었습니다. 무언가를 추가합시다 : type을 사용하는 일반적인 메소드에서 성공적으로 변환하는 T것과 같은 것이 필요 result=(value is JObject) ? ((JObject)value).ToObject<T>() : (T)default(T);했습니다 (주 value-JObject 일 수도 있고 다른 경우 결과가 null이어야하는 데이터베이스에서 오는 객체입니다).
Matt

@ShaunRowan Linqpad의 코드를 사용하여 리플렉션을 사용하면 JSON 객체의 해당 필드와 동일한 대상 레벨의 "레벨"에서 속성을 일치시키는 것처럼 보입니다. 속성 이름은 JSON 필드 이름과 일치해야하며 속성 유형은 호환 가능한 유형이어야합니다.
BobbyA

jobject.ToObject(myObject.GetType())객체 유형을 모르는 경우 사용 하십시오.
Tohid

45

내가 찾은 문서에서

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)를 참조하십시오.


2
사용자 지정 직렬화 설정을 전달하려면 속기 대신이 방법을 사용해야했습니다.
저스틴 칼디 콧

내가 찾은 정확한 답변
Mark-VII

2

누군가가 다른 방법을 찾고있는 경우를 대비하여 너무 늦었습니다.

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; }
}

이것은 정답 처럼 보입니다 .
jpaugh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.