2012-10-10 51 views
3

如何反序列化JSON以下使用Web API(JSON.Net)?:如何反序列化這個JSON?

{ 
    "action": "edit", 
    "table": "MainView", 
    "id": "row_1377", 
    "_group_id": "999", 
    "data": { 
     "ROTATION": "1", // This name/val can change 
     "EQUIPMENT": [{ 
      "id": "6" 
     }, 
     { 
      "id": "8" 
     }], 
     "NOTES": "" 
    } 
} 

值在data代表列可以改變的,所以我不能讓一個集多功能於石對象例如一個名爲「NOTES」的字符串,如json.net deserialize string to nested class

通知EQUIPMENT包含多個值。當它以前只是一個像「NOTES」這樣的「字符串:字符串」時,這個JSON將data反序列化爲Dictionary<string, string>,但現在我需要它像自己的字典一樣工作。我最後的嘗試是反序列化到以下類型:

public class EditorSubmissionJoined 
{ 
    public string _group_id { get; set; } 
    public string action { get; set; } 
    public string table { get; set; } 
    public string id { get; set; } 
    // "public" added below due to mistake noticed by Maggie Ying 
    public Dictionary<string, object> data { get; set; } // Trouble 
} 

我希望在object可以在data包含任何內容是否KeyValuePair(如NOTES)或字典(如EQUIPMENT)。

我也試過Dictionary<string, ICollection<Object>>,Object,甚至ICollection<Dictionary<string, Object>>

的問題是,我的控制器總是得到什麼也沒有,但空值EditorSubmissionJoined:

public void Put(EditorSubmissionJoined ajaxSubmission) { 
    // ajaxSubmission has only NULL values 
} 
+2

你應該能夠反序列化爲動態:http://stackoverflow.com/questions/4535840/deserialize-json-object-into-dynamic-object-using-json-net –

回答

1

有幾種方法可以做到這一點。一種方法是簡單地使用JObject並按名稱訪問字段,例如, :jsonObject["data"]["ROTATION"]。您可以使用JObject.Parse「反序列化」,並將JSON文本「解析」爲JObject

或者,您可以編寫自己的JsonConverter,並在反序列化特定類型時告訴JSON.net使用該轉換器(例如JsonConverterAttribute)。這需要在ReadJson重寫中手動解析部分JSON文本,而且實際上取決於您期望的數據。

您還可以使用Preston評論的動態方法。

你選擇哪種方法取決於你想要的東西的強類型。

+0

這太糟糕了JSON.net還不支持更強大的類型的方法,而不必寫一個轉換器,但我必須在系統內工作。謝謝。 –

+0

嗯,問題是「數據」取決於某些國家。我想你可以定義一個「數據」類,它包含所有可能的「數據」可能具有的名稱/值對。但是,你有一個相當笨拙的課,很難知道在什麼情況下哪些字段是有效的。基於上下文改變類型的值也存在問題。 (例如,如果VALUE是一個上下文中的字符串,而另一個上下文是日期/時間)...... –

+0

雖然在這個例子中看起來'data'可以被序列化爲'Object',其中包含'KeyValuePair'和一系列詞典。誠然,對於一個真正動態的對象來說,提前不知道結果會很不方便,但在這種情況下和大多數情況下,我認爲問題並不是很糟糕:對於數據中的每個對象{如果它是字典,則執行X else else if這是一個KeyValuePair做Y.} 我確信JSON.Net作者對此有很多想法並有他的理由。 –

2

試試你的「數據」屬性設置爲公衆和你的JSON應該能夠正確模擬綁定。

+0

非常仔細。不幸的是,只有我用'Dictionary '發佈的代碼是私有的(oops),因爲我的實際代碼使用了一個基類,我爲我的SO帖子簡化了並且搞砸了。 –