2012-02-03 4 views
0

내 첫 시도 및 JSON desrialization과 나는 막혔다. 도움이 될지 궁금한가요?중첩 된 데이터의 비 직렬화

나는 다음 여기에 JSON

{ 
    "summary":{ 
     "pricing":{ 
      "net":988, 
      "tax":13, 
      "gross":729 
     }, 
     "status":{ 
      "runningfor":29881175, 
      "stoppedfor":88805, 
      "idlefor":1298331744 
     } 
    } 
} 

내 C# 코드

private void MakeRequest() 
{ 
    HttpWebRequest request = WebRequest.Create(Url) as HttpWebRequest; 
    request.Method = "GET"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.Credentials = new NetworkCredential(Username, Password); 
    request.Headers.Add(string.Format("App-Key: {0}", ApiKey)); 

    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
    { 
     StreamReader reader = new StreamReader(response.GetResponseStream()); 
     string resutls = reader.ReadToEnd(); 
     Response.Write(resutls); 
     Status status = JSONHelper.JsonDeserialize<Status>(resutls); 
     Response.Write(status.RunningFor); 
    } 
} 

public class JSONHelper 
{ 
    /// <summary> 
    /// JSON Deserialization 
    /// </summary> 
    public static T JsonDeserialize<T>(string jsonString) 
    { 
     T obj = Activator.CreateInstance<T>(); 
     MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)); 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); 
     obj = (T)serializer.ReadObject(ms); 
     ms.Close(); 
     return obj; 
    } 
} 


[DataContractAttribute(Name = "status")] 
public class Status 
{ 
    [DataMember(Name = "runningfor")] 
    public int RunningFor{ get; set; } 
    [DataMember(Name = "stoppedfor")] 
    public int StoppedFor{ get; set; } 
    [DataMember(Name = "idlefor")] 
    public int IdleFor{ get; set; } 
} 

을 그리고 난 전혀 다른 상태의 결과 아무것도에만 관심이 있어요. 내가 RunningFor를 0으로 돌려주는 것만 큼 나는 잘못하고있다.

미리 감사

답변

1

에서 당신은 당신이 아니라 당신이 원하는 부분에, 역 직렬화하려는 전체 JSON에 매핑되는 구조로 역 직렬화 할 필요가있다. 귀하의 경우 아래 코드는이를 수행하는 한 가지 방법을 보여줍니다.

public class StackOverflow_9135439 
{ 
    const string JSON = @"{ 
    ""summary"":{ 
     ""pricing"":{ 
      ""net"":988, 
      ""tax"":13, 
      ""gross"":729 
     }, 
     ""status"":{ 
      ""runningfor"":29881175, 
      ""stoppedfor"":88805, 
      ""idlefor"":1298331744 
     } 
    } 
}"; 
    [DataContractAttribute(Name = "status")] 
    public class Status 
    { 
     [DataMember(Name = "runningfor")] 
     public int RunningFor { get; set; } 
     [DataMember(Name = "stoppedfor")] 
     public int StoppedFor { get; set; } 
     [DataMember(Name = "idlefor")] 
     public int IdleFor { get; set; } 
    } 

    [DataContract] 
    public class Summary 
    { 
     [DataMember(Name = "status")] 
     public Status Status { get; set; } 

     // add "pricing" later if you need 
    } 

    [DataContract] 
    public class Response 
    { 
     [DataMember(Name = "summary")] 
     public Summary Summary { get; set; } 
    } 

    public class JSONHelper 
    { 
     /// <summary> 
     /// JSON Deserialization 
     /// </summary> 
     public static T JsonDeserialize<T>(string jsonString) 
     { 
      T obj = Activator.CreateInstance<T>(); 
      MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)); 
      DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); 
      obj = (T)serializer.ReadObject(ms); 
      ms.Close(); 
      return obj; 
     } 
    } 

    public static void Test() 
    { 
     Response resp = JSONHelper.JsonDeserialize<Response>(JSON); 
     Console.WriteLine(resp.Summary.Status.RunningFor); 
    } 
} 
0

DataContractJsonSerializer는 대소 문자를 구분합니다. "runningfor"를 사용하십시오.

관련 문제