2016-02-29 53 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對象轉換爲字符串。並編輯字符串以製作相同的格式。

比你可以分析這兩個字符串,它是在相同的格式

相關問題