2016-07-31 2 views
3

API에서 JSON 응답을 역 직렬화하려고합니다. JSON은 다음과 같습니다 (MAC 주소 및 위치가 변경됨) :알 수없는 객체 이름으로 JSON을 비 직렬화

{ 
"body" : [{ 
     "_id" : "da:87:54:26:53:97", 
     "place" : { 
      "location" : [-23.334961, 47.398349], 
      "altitude" : 30, 
      "timezone" : "Europe\/London" 
     }, 
     "mark" : 3, 
     "measures" : { 
      "f2:bf:a7:6f:e7:e8" : { 
       "res" : { 
        "1469997248" : [20.4, 66] 
       }, 
       "type" : ["temperature", "humidity"] 
      }, 
      "42:b7:48:59:7c:4b" : { 
       "res" : { 
        "1469997263" : [1016.7] 
       }, 
       "type" : ["pressure"] 
      } 
     }, 
     "modules" : ["f2:bf:a7:6f:e7:e8"] 
    } 
], 
"status" : "ok", 
"time_exec" : 0.034152030944824, 
"time_server" : 1469997417 
} 

문제는 측정 블록입니다. 개체의 이름이 변하기 때문에 C# 개체로 올바르게 deserialize하는 방법을 모르겠습니다. I found a similiar problem on here with the solution to use a dictonary, 그러나 내가이 방법을 시도하면 null 디렉토리가 생깁니다.

이 내 역 직렬화하는 방법입니다 :

APIResponse apiResponse = JsonConvert.DeserializeObject<APIResponse>(await content.ReadAsStringAsync()); 

그리고 이것은 APIResponse 클래스입니다 :

public class APIResponse 
{ 
    public Body[] body { get; set; } 
    public string status { get; set; } 
    public float time_exec { get; set; } 
    public int time_server { get; set; } 
} 

public class Body 
{ 
    public string _id { get; set; } 
    public Place place { get; set; } 
    public int mark { get; set; } 
    public Measures measures { get; set; } 
    public string[] modules { get; set; } 
} 

public class Place 
{ 
    public float[] location { get; set; } 
    public float altitude { get; set; } 
    public string timezone { get; set; } 
} 

public class Measures 
{ 
    public Dictionary<string, SingleModule> singlemodules{ get; set; } 
} 

public class SingleModule 
{ 
    public Res res { get; set; } 
    public string[] type { get; set; } 
} 

public class Res 
{ 
    public MeasuredData measuredData { get; set; } 
} 
public class MeasuredData 
{ 
    public float[] values { get; set; } 
} 

제대로 쉽게 조치를 derserialize 수있는 방법?

답변

12

Measures 클래스를 제거 할 수 있어야합니다. 난 강력 어떻게 번역하는 Json.NET에 표시하기 위해 귀하의 속성에 대한 .NET 명명 규칙을 다음과 [JsonProperty("measures")] 등을 사용하는 것이 좋습니다 것, 별도의 문제로서

public class Body 
{ 
    public string _id { get; set; } 
    public Place place { get; set; } 
    public int mark { get; set; } 
    public Dictionary<string, SingleModule> measures { get; set; } 
    public string[] modules { get; set; } 
} 

대신, 똑바로 Body 클래스로 사전을 넣어 귀하의 속성을 JSON으로 변환하십시오.

+0

이름이 JSON에서 생성되었으므로 이름이 엉망입니다. 아직 실제로 편집하지 않았습니다. 어쨌든이 솔루션이 작동합니다. 감사! – Niruga

+0

음, 방금 변경된 이름을 가진'res'의 자식 객체에 비슷한 문제가 있다는 것을 눈치 챘습니다. 이 문제를 어떻게 해결할 수 있습니까? – Niruga

+1

@Niruga : 같은 방식으로 다시'Res' 클래스를 없애고'Dictionary '또는'Dictionary >' –

관련 문제