2014-09-04 6 views
2

json을 C#의 객체로 deserialize하려고합니다. 내가 할 수 있기를 원하는 것은 모든 객체를 전달하는 것입니다. JSON.Net 라이브러리를 사용하여 JSON을 특정 객체에 형식을 역 직렬화합니다. 다음은 코드 행입니다.json을 전달 된 객체로 동적으로 deserialize합니다. C#

Object someObject1 = someObject; 
string result = await content.ReadAsStringAsync(); 
return JsonConvert.DeserializeObject<someObject1.GetType()>(result); 

마지막 줄은 내가 C#을 불평없이 <의 데이터 형식을> 어떻게합니까

operator '<' cannot be applied to operands of type 'method group' 

의 예외가 발생합니다. 이 코드가 작동하도록하려면 어떻게해야합니까? 그리고 내가 누락 된 지식은 무엇입니까?

답변

2

JsonConvert.DeserializeObject<T>은 컴파일 타임 형식이 필요합니다. 질문에서 원하는대로 런타임에 유형을 전달할 수 없습니다 (List<T>을 선언하는 것과 다를 바 없음). 일반 json 객체 JObject (또는 동적)으로 비 직렬화하거나 객체의 인스턴스를 만들어 json으로 채워야합니다.

정적 메서드 PopulateObject을 사용할 수 있습니다. 물론 개체의 속성이 인 경우과 일치하면 역 직렬화 할 수 있습니다.

JsonConvert.PopulateObject(result, someObject1); 
+0

그래서 someObject 객체를 전달하면 someObject가 someOtherObjectIMade 유형이며 someOtherObjectIMade의 필드가 올바르게 채워 집니까? –

+1

그것은 방금 테스트했습니다. –

0

당신은 dynamic를 일반적인 방법을 무시하고 사용할 수 있습니다

var myObj = (dynamic)JsonConvert.DeserializeObject(result); 

을하지만, 객체가 같은 유형이 아닌 경우 유형을 구분 힘든 시간을해야합니다 아마 공격 런타임 오류.

0

주어진 JSON 데이터의 개체 필드를 채우는 가장 좋은 방법입니다.

이 코드는 메서드 자체로 개체 자체에 포함됩니다.

public void PopulateFields(string jsonData) 
{ 
    var jsonGraph = JObject.Parse(jsonData); 
    foreach (var prop in this.GetType().GetProperties()) 
    { 
     try 
     { 
      prop.SetValue(this, fields[prop.Name].ToObject(prop.PropertyType), null); 
     } 
     catch (Exception e) 
     { 
      // deal with the fact that the given 
      // json does not contain that property 
     } 
} 
관련 문제