我有这个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#有点生疏,所以我不确切地知道我做错了什么。有人可以启发我吗?
答案 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格式为
自己使用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);