我如何反序化这个json?

时间:2016-02-27 21:44:23

标签: c# json json.net

我需要一些帮助来反序列化这个json,特别是API请求返回一个包含多个json的响应,如下所示:

{"trace":{"details":{"[date]":"[27-02-2016 9:47:00.666970]","[level]":"[info]","[message]":"[System Done.]"},"context":[]}}
{"trace":{"details":{"[date]":"[27-02-2016 9:47:00.677366]","[level]":"[info]","[message]":"[Trace Done.]"},"context":[[{"ID":"John Doe"}]]}}

你怎么看上面有两个json返回。这实际上是我的班级:

class Foo
{
    public class Details
    {
       public string date { get; set; }
       public string level { get; set; }
       public string message { get; set; }
    }

    public class Trace
    {
        public Details details { get; set; }
        //context?
    }
    public void getJson()
    {
        string responseText = Connection.Request("api call");

        var obj = JsonConvert.DeserializeObject<Details>(responseText);
        Console.WriteLine(responseText);
    }
}

变量responseText包含上面的两个json,我需要迭代trace的每一行并反序列化它,有人可以帮我实现这个吗?

3 个答案:

答案 0 :(得分:0)

您可以使用Json.NET反序列化您的json结果并将其映射到您的类! Get JSON.net from here :)

答案 1 :(得分:0)

您缺少该行的类定义。然后你应该按行分割你的响应字符串并反序列化它们。

using System.Linq;   
...
class Foo
{
    public class ResponseLine
    {
        public Trace trace { get; set; }
    }

    public class Context
    {
        public string ID { get; set; }
    }

    public class Details
    {
       public string date { get; set; }
       public string level { get; set; }
       public string message { get; set; }
    }

    public class Trace
    {
        public Details details { get; set; }
        public Context[][] context { get; set; }
    }

    public void getJson()
    {
        string responseText = Connection.Request("api call");
        Console.WriteLine(responseText);

        // responseText is not valid JSON, need to split it by lines
        // before deserializing.
        var traces = responseText.Split('\n')
            .Where(l => !string.IsNullOrWhiteSpace(l))
            .Select(l => JsonConvert
                .DeserializeObject<ResponseLine>(l))
            .ToList();
    }
}

我添加了context属性所需的内容。但我猜这个数组数组可能包含除示例中显示的ID之外的其他属性。

答案 2 :(得分:0)

首先你将它们分开,因为你说有不同的行,只需使用ReadAllLines来获取一个字符串数组。然后迭代并反序列化。最后得到一个Details对象列表。

 string[] strs = response.Split(new char[]{'\n'});
 List<Details>list new List<Details>();
 foreach(string str in str)
 {
     list.Add(JsonConvert.DeserializeObject<Details>(str));
 }