我在.NET for WinRT(C#)我想將JSON字符串反序列化爲Dictionary<string, object>
,其中字典值可以稍後將轉換爲實際類型。 JSON字符串可以包含一個對象層次結構,我也想在Dictionary<string, object>
中有子對象。將JSON對象層次結構反序列化爲字典層次結構<string,object>
下面是一個示例JSON它應該能夠處理:
{
"Name":"John Smith",
"Age":42,
"Parent":
{
"Name":"Brian Smith",
"Age":65,
"Parent":
{
"Name":"James Smith",
"Age":87,
}
}
}
我試圖與DataContractJsonSerializer做像這樣:
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings();
settings.UseSimpleDictionaryFormat = true;
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Dictionary<string, object>), settings);
Dictionary<string, object> results = (Dictionary<string, object>)serializer.ReadObject(ms);
}
這實際上爲第一級工作正常,但那麼「父」只是一個對象,不能被鑄造到一個Dictionary<string, object>
:
Dictionary<string, object> parent = (Dictionary<string, object>)results["Parent"];
Cannot cast 'results["Parent"]' (which has an actual type of 'object') to 'System.Collections.Generic.Dictionary<string,object>'
然後我嘗試使用Json.NET但子對象是JObject本身是IDictionary<string, JToken>
,這迫使我遍歷整個層次結構並再次轉換它們。
有人會知道如何使用現有的序列化程序來解決這個問題嗎?
編輯
我使用Dictionary<string, object>
因爲我的對象有所不同從一個服務器調用另一個(例如「ID」屬性可能是「ID」,* 「CUST_ID」 *或「customerId」取決於請求),並且由於我的應用不是使用這些服務的唯一應用,所以至少現在我無法改變這一點。
因此,我覺得使用不方便DataContractAttribute和DataMemberAttribute在這種情況下。 相反,我想將所有內容都存儲在通用字典中,並且擁有一個強類型屬性「Id」,它在字典中查找「id」,「cust_id」或「customerId」,使其對用戶界面透明。
該系統對JSON.NET非常有效,但是如果服務器返回一個對象層次結構,子對象將作爲JObjects存儲在我的字典中而不是另一個字典中。總結一下,我正在尋找一個高效的系統,使用WinRT中提供的JSON序列化程序將對象層次轉換爲層次結構Dictionary<string, object>
。
看到我的編輯答案。希望這可以幫助! –