2016-02-29 62 views
1

我有此JSON结构:如何管理同一类中的两种类型的json?

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

现在的问题是,有时

[{"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"}]]}}}] 

我可以用这个类正确地反序列化json以此结构返回:

{ 
    "success": false, 
    "message": "No content." 
} 

我的代码出错了,因为结构不同。我试图读取标题,但返回为200'导致没有错误happean。那么如何才能识别不同的结构并避免json异常呢?这是管理不同的JSON结构类:

public class RootObject 
{ 
     public bool success { get; set; } 
     public string message { get; set; } 
} 

我能在异常做到这一点,但是这是不是一个好的做法,还有另一种方式?

+0

是否标准的消息包括:'“成功”:TRUE'? – LegionMammal978

+0

该消息仅在第二种情况下返回,如果有内容我得到完整的堆栈“跟踪”,我也会得到'success:false'和相关的'消息' – Dillinger

+0

在这种情况下,没有理由在那里甚至是'成功'参数,如果它总是存在'假'的话。你有任何控制输入? – LegionMammal978

回答

5

在你们这样的情况下,较好的是先获得JToken,然后检查是否有消息属性和反序列化到正确的对象:

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 
} 
+0

看起来不错,我会尝试你的提示,谢谢:) – Dillinger

+0

唯一的问题是,如果有内容,我得到这个异常:'System.ArgumentException:访问JArray值与无效键值:“消息”'但一般该解决方案工作。 – Dillinger

+0

奇怪的是,一个JToken(JContainer是一个JToken)应该返回null,如果它没有一个键,也许这是因为响应只是一个数组,然后如果是这种情况,你可以做“if(container is JArray)” – Gusman

-1

不是一个正确的方式,但我已经做到了这一点。

将生成的json对象转换为字符串。并编辑字符串以制作相同的格式。

比你可以分析这两个字符串,它是在相同的格式

相关问题