【发布时间】:2014-01-09 17:28:13
【问题描述】:
我在 .NET for WinRT (C#) 中,我想将 JSON 字符串反序列化为 Dictionary<string, object>,以后可以将字典值转换为实际类型。
JSON 字符串可以包含对象层次结构,我也希望在 Dictionary<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);
}
这实际上适用于第一级,但是 "Parent" 只是一个无法转换为 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”,使其对 UI 透明。
这个系统与 JSON.NET 配合得很好,但是如果服务器返回一个对象层次结构,子对象将作为 JObjects 存储在我的字典中,而不是另一个字典中。
总而言之,我正在寻找一个高效的系统来使用 WinRT 中可用的 JSON 序列化程序将对象层次结构转换为 Dictionary<string, object> 的层次结构。
【问题讨论】:
-
查看我编辑的答案。希望这会有所帮助!