我需要一些帮助来反序列化这个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
的每一行并反序列化它,有人可以帮我实现这个吗?
答案 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));
}