我有这个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"}]]}}}]
我可以使用这个类正确地反序列化它:
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;
}
反序列化的一个例子:
var response = "json above";
var obj = JsonConvert.DeserializeObject<List<Trace>>(response);
现在的问题是,有时会以这种结构返回json:
{
"success": false,
"message": "No content."
}
我的代码出错了导致结构不同。我试图读取标题,但返回为200&#39;因为没有错误发生。那么如何识别不同的结构并避免json异常呢?这是管理不同json结构的类:
public class RootObject
{
public bool success { get; set; }
public string message { get; set; }
}
我可以在例外中这样做,但这不是一个好习惯,还有另外一种方法吗?
答案 0 :(得分:5)
在像你这样的情况下,最好先获取一个JToken,然后检查它是否具有message属性并反序列化为正确的对象:
var container = (JContainer)Newtonsoft.Json.JsonConvert.DeserializeObject(response);
var message = container["message"];
if(message == null)
{
var obj = container.ToObject<List<Trace>>();
//Do whatever you need to do with the object
}
else
{
var msg = container.ToObject<RootObject>();
//Do whatever you need to do with the object
}
答案 1 :(得分:-1)
不是一个正确的方法,但我已经做到了。
将生成的json对象转换为string。并编辑字符串以使格式相同。
您可以解析两个格式相同的字符串