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.