我是在使用.NET for WinRT (C#)进行开发,我想将JSON字符串反序列化为一个
以下是它应该能够处理的示例JSON:
我尝试使用Json.NET,但是子对象本身就是JObject,即
有人知道如何使用现有的序列化程序解决这个问题吗?
编辑
我正在使用
因此,在这种情况下,我发现使用DataContractAttribute和DataMemberAttribute不方便。相反,我想将所有内容存储在通用字典中,并拥有一个单一的强类型属性“Id”,该属性查找字典中的“id”、“cust_id”或“customerId”,使其对UI透明。
这个系统与JSON.NET非常配合,但是如果服务器返回对象层次结构,则子对象将作为JObjects存储在我的字典中,而不是另一个字典中。
总之,我正在寻找一种有效的系统,可以使用WinRT中可用的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>
层次结构。