如何在同一个类中管理两种类型的json?

时间:2016-02-29 12:46:24

标签: 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"}]]}}}]

我可以使用这个类正确地反序列化它:

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; }
 }

我可以在例外中这样做,但这不是一个好习惯,还有另外一种方法吗?

2 个答案:

答案 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。并编辑字符串以使格式相同。

您可以解析两个格式相同的字符串