无法正确反序列化json

时间:2016-02-28 10:18:04

标签: c# json

我有这个json:

[{"trace":{"details":{"date":"[28-02-2016 11:04:26.856573]","type":"[info]","message":"[system done.]"},"context":{"context":[[{"ID":"john dillinger"}]]}}},{"trace":{"details":{"date":"[28-02-2016 11:04:26.856728]","type":"[info]","message":"[trace done.]"},"context":{"context":[[{"ID":"john dillinger"}]]}}}]
  

Newtonsoft.Json.JsonSerializationException:无法将当前JSON数组(例如[1,2,3])反序列化为类型,因为该类型需要一个JSON对象(例如{" name":&#34 ;值"})正确反序列化。

我已经创建了这个类来反序列化它:

public class Testing
{
    public string date { get; set; }
    public string type { get; set; }
    public string message { get; set; }
    public string context { get; set; }
}

这是反序列化内容的代码:

string responseText = "json above";
var obj = JsonConvert.DeserializeObject<Testing>(responseText); //on this line the problem

obj行我得到了例外。我对c#有点生疏,所以我不确切地知道我做错了什么。有人可以启发我吗?

3 个答案:

答案 0 :(得分:3)

您的json不是您的Testing类的平面数据。尝试使用以下

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

public class Context
{
    public List<List<ContextElement>> context { get; set; }
}

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

public class RootObject
{
    public Trace trace { get; set; }
}

只需点击你的json到http://json2csharp.com/,你似乎需要为上下文的ID部分添加这个类型并修改结果,以便上下文在列表中使用它。

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

您解析的json格式为

json

自己使用https://jsonformatter.curiousconcept.com/进行检查。然后你只需要创建一个C#类来匹配该结构。

答案 1 :(得分:2)

您需要反序列化student(M,V,N,S)的集合 - 例如Trace

List<Trace>

假设您有以下DTO:

var obj = JsonConvert.DeserializeObject<List<Trace>>(responseText);

证明(响应只是由您提供的一行,但是使用转义引号,以便可以将其直接放入代码中):

public class Trace
{
    public TraceValue trace;
}

public class TraceValue
{
    public Details details;
    public Context context;
}

public class Details
{
    public String date;
    public String type;
    public String message;
}

public class Context
{
    public List<List<IdItem>> context;
}

public class IdItem
{
    public String ID;
}

答案 2 :(得分:0)

我认为你应该使用JavaScripSerializer

JavaScriptSerializer jsSerializer = new JavaScriptSerializer();

你可以尝试

var obj = jsSerializer.Deserialize<Testing>(responseText);

我不确定这个解决方案,在你的情况下它可能会起作用。 但是您可以将json字符串反序列化为任何维度的字符串数组:

var obj = jsSerializer.Deserialize<string[]>(responseText);
var obj = jsSerializer.Deserialize<string[][]>(responseText);