C# 如何反序列化此json?

C# 如何反序列化此json?,c#,json,json.net,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]","

我需要一些帮助来反序列化此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);
    }
}
class-Foo
{
公开课详情
{
公共字符串日期{get;set;}
公共字符串级别{get;set;}
公共字符串消息{get;set;}
}
公共类跟踪
{
公共详细信息{get;set;}
//背景?
}
public void getJson()
{
字符串responseText=Connection.Request(“api调用”);
var obj=JsonConvert.DeserializeObject(responseText);
Console.WriteLine(responseText);
}
}

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

你可以使用json.NET反序列化你的json结果并将其映射到你的类!
您缺少该行的类定义。然后,您应该将响应字符串按行拆分并反序列化它们

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();
    }
}
使用System.Linq;
...
福班
{
公共类响应线
{
公共跟踪跟踪{get;set;}
}
公共类上下文
{
公共字符串ID{get;set;}
}
公开课详情
{
公共字符串日期{get;set;}
公共字符串级别{get;set;}
公共字符串消息{get;set;}
}
公共类跟踪
{
公共详细信息{get;set;}
公共上下文[][]上下文{get;set;}
}
public void getJson()
{
字符串responseText=Connection.Request(“api调用”);
Console.WriteLine(responseText);
//responseText不是有效的JSON,需要将其按行拆分
//在反序列化之前。
var traces=responseText.Split('\n')
.Where(l=>!string.IsNullOrWhiteSpace(l))
.选择(l=>JsonConvert
.反序列化对象(l))
.ToList();
}
}

我添加了
上下文
属性所需的内容。但是我猜这个数组可能包含了你例子中显示的
ID
以外的其他属性。

首先你要将它们分开,因为你说在不同的行上有,所以只需要使用ReadAllLines来获得一个字符串数组。然后进行迭代和反序列化。您将得到一个详细信息对象列表

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

我需要迭代不是有效json的每一行
,但如果是,则可能会反序列化为数组或项目列表必须将json反序列化为列表并迭代。再简单不过了。那么用户在一个请求中发送两个json对象?这并不是应该怎么做的,您可以将它们作为数组发送:比如
[json1,json2]
。使用DataContractJsonSerializer。Enjoy问题上显示的文件无效。序列化程序将不起作用。
response
不是文件名
文件。ReadAllLines(response)
=>如果为True,则应将其拆分。