当前位置: 首页 > 编程语言 > C#

将JSON对象层次结构反序列化为字典层次结构分享

时间:2023-04-10 20:08:31 C#

将JSON对象层次结构反序列化为字典层次结构JSON字符串反序列化为字典,字典中的值稍后可以转换为实际类型。JSON字符串可以包含对象层次结构,我想像Dictionary中的子对象也是如此。这是它应该能够处理的JSON示例:{"Name":"JohnSmith","Age":42,"Parent":{"Name":"BrianSmith","Age":65,"Parent":{"Name":"JamesSmith","Age":87,}}}我尝试使用DataContractJsonSerializer执行此操作:DataContractJsonSerializerSettings();settings.UseSimpleDictionaryFormat=true;DataContractJsonSerializerserializer=newDataContractJsonSerializer(typeof(Dictionary),settings);字典结果=(Dictionary)serializer.ReadObject(ms);这实际上适用于第一级,但“父级”只是一个不能转换为字典的级别:Dictionaryparent=(Dictionary)results["Parent"];无法将“results["Parent"]”(具有“object”的实际类型)转换为“System.Collections.Generic”。Dictionary'然后我尝试使用Json.NET,但子对象是JObjects,它们本身就是IDictionaries,这迫使我遍历整个层次结构并将它们转换回来。有人知道如何使用现有的序列化器来解决这个问题吗?编辑我正在使用字典,因为我的对象是从一个服务器调用到另一个服务器(例如,“Id”属性可以是“id”、*“cust_id”*或“customerId”,具体取决于请求)和我的应用程序它不是唯一使用这些服务的应用程序,我不能改变它,至少现在是这样。因此,我觉得在这种情况下使用DataContractAttribute和DataMemberAttribute很不方便。相反,我想将所有内容存储在通用字典中,并且只有一个强类型属性“Id”,它在字典中查找“id”、“cust_id”或“customerId”,使其对UI透明。该系统适用于JSON.NET,但如果服务器返回对象层次结构,则子对象将作为JObjects存储在我的字典中,而不是另一个字典中。总之,我正在寻找一种高效的系统,使用WinRT中提供的JSON序列化程序将Dictionary对象层次结构转换为Dictionary的层次结构。我正在使用JSON.NET库和ExpandoObject类的组合解决WinRT应用程序中的相同问题。该库很好地将JSON数据反序列化为实现IDictionary的ExpandoObjects。ExpandoObject的键值对的值可以很容易地视为另一个ExpandoObject。这是我使用的方法,适用于您的类型:voidLoadJSONData(){stringtestData="{"Name":"JohnSmith","Age":42,"Parent":{"Name":"BrianSmith","Age":65,"Parent":{"Name":"JamesSmith","Age":87,}}}";ExpandoObjectdataObj=JsonConvert.DeserializeObject(testData,newExpandoObjectConverter());//直接抓取父对象(如果存在)并视为ExpandoObjectvarparentElement=dataObj.Where(el=>el.Key=="Parent").FirstOrDefault();if(parentElement.Value!=null&&parentElement.ValueisExpandoObject){ExpandoObjectparentObj=(ExpandoObject)parentElement.Value;//对父对象做一些事情...}//或者,遍历expando的属性foreach(varpropertyin(IDictionary)dataObj){if(property.Key=="Parent"&&property.Value!=null&&property.ValueisExpandoObject){foreach(varparentPropin(ExpandoObject)property.Value){//对父expando中的属性做一些事情}}}}试试这个代码片段:vard=newSystem.Web.Script.Serialization.JavaScriptSerializer();varresults=d.Deserialize>(jsonString);varparent=(Dictionary)results["Parent"];根据参考,JavaScriptSerializer类支持Windows8的反序列化,Json.NET也是Windows8支持可以考虑的一个选项。添加,对于WinRT:根据您的JSON定义DataContract。[DataContract]publicclassCustomObject{[DataMember(Name="Name")]publicstringName{get;放;}[DataMember(Name="Age")]publicstringAge{get;放;}[DataMember(Name="Parent")]publicDictionaryParent{get;放;反序列化时使用DataContract类。使用(MemoryStreamms=newMemoryStream(Encoding.UTF8.GetBytes(json))){DataContractJsonSerializerSettings设置=newDataContractJsonSerializerSettings();settings.UseSimpleDictionaryFormat=true;DataContractJsonSerializer序列化器=newDataContractJsonSerializer(typeof(CustomObject),settings);CustomObject结果=(CustomObject)serializer.ReadObject(ms);字典parent=results.Parent;}参考:UseDataContractJsonSerializertocreate.NETobjectsfromJSON以上是C#学习教程:将JSON对象层次反序列化为Dictionary层次全部分享如果内容对你有用,需要进一步了解C#学习教程,希望你会更加关注它。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: