Десериализация вложенных данных - PullRequest
0 голосов
/ 04 февраля 2012

Моя первая попытка и десериализация JSON, и я застрял, просто интересно, не могли бы вы помочь?

У меня есть следующий 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; }
}

И меня интересует только результат статуса, больше ничего. что я делаю не так, так как он возвращает только 0 для RunningFor.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

Вам необходимо десериализовать в структуру, которая отображает весь 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 голосов
/ 04 февраля 2012

DataContractJsonSerializer чувствителен к регистру. Используйте «runningfor».

...