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

Newtonsoft.Json,PopulateDictionaryfailedtoshare

时间:2023-04-10 16:06:20 C#

Newtonsoft.Json,PopulateDictionaryfailed我是通过Newtonsoft.json把字典序列化成json的,代码如下:varserializeSettings=newJsonSerializerSettings{TypeNameHandling=TypeNameHandling.All,TypeNameAssemblyFormat=FormatterAssemblyStyle.Full,Formatting=Formatting.Indented};varserializedObject=JsonConvert.SerializeObject(dic,serializeSettings);此代码生成如下json:{"$type":"System.Collections.Generic.Dictionary`2[[System.Guid,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089],[System.String,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]],mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089,"9648af76-7986-4b34-8b2c-97b2345769ef":"Test"}我尝试通过以下代码将json反序列化为字典:varnewDic=newDictionay();vardeserializeSettings=newJsonSerializerSettings{TypeNameHandling=TypeNameHandling.All,TypeNameAssemblyFormat=FormatterAssemblyStyle.Full,Formatting=Formatting.Indented}JsonConvert.PopulateObject(serializedObject,newDic,deserializeSettings);但是出现如下异常:Unabletoconvertstring'$type'todictionarykeytype'System.Guid'创建TypeConverter转换字符将字符串转换为键类型的对象。Path'$type',line2,position10.atNewtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateDictionary(IDictionarydictionary,JsonReaderreader,JsonDictionaryContractcontract,JsonPropertycontainerProperty,Stringid)atNewtonsoft.Json.Serialization.JsonSerializerInternalReader.Populate(JsonReaderreader,Objecttarget)在Newtonsoft.Json.JsonSerializer。PopulateInternal(JsonReaderreader,Objecttarget)atNewtonsoft.Json.JsonSerializer.Populate(JsonReaderreader,Objecttarget)atNewtonsoft.Json.JsonConvert.PopulateObject(Stringvalue,Objecttarget,JsonSerializerSettingssettings)我这样写GuidConverter并使用它。但不是publicclassGuidConverter:JsonConverter{publicoverrideboolCanConvert(TypeobjectType){returnobjectType.IsAssignableFrom(typeof(Guid));}publicoverrideobjectReadJson(JsonReaderreader,TypeobjectType,objectexistingValue,JsonSerializerserializ){serializer.Deserialize(reader);}catch{返回Guid.Empty;}}publicoverridevoidWriteJson(JsonWriterwriter,objectvalue,JsonSerializerserializer){serializer.Serialize(writer,value);编辑:我发现了我的问题。更改代码以将json反序列化为字典,现在结果字典中的第一项是:Kay:"$type"Value:"System.Collections.Generic.Dictionary`2[[System.Guid,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089],[System.String,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]],mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyTokenb77a5c561934e089"为什么??问题是您在序列化字典时指定了TypeNameHandling=TypeNameHandling.All。这会导致元数据“$type”属性作为字典中的第一个对象发出:{"$type":"System.Collections.Generic.Dictionary`2[[System.Guid,mscorlib,Version=2.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089],[System.String,mscorlib,版本=2.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]],mscorlib,版本=2.0.0.0,文化=中性,PublicKeyToken561934e089]],mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken5,081"9648af76-7986-4b34-8b2c-97b2345769ef":"Test"}DeserializeObjectusingDeserializeObject,Json.NET构造对应的c#对象时通常会用到这个标签。但是您在预分配的字典上使用PopulateObject。因此,Json.NET没有在构造期间使用元数据属性,而是尝试将其添加到字典中,但失败了。解决方案是在deserializeSettings中设置MetadataPropertyHandling=MetadataPropertyHandling.ReadAhead。这样做会导致“$type”属性被无条件使用或被忽略(视情况而定):vardeserializeSettings=newJsonSerializerSettings{.ReadAhead};JsonConvert.PopulateObject(serializedObject,newDic,deserializeSettings);从发行说明中可以看出,此设置的内存使用量和速度略有下降。或者,如果您不能无条件地需要JSON中的元数据类型信息,则可以使用TypeNameHandling=TypeNameHandling.Auto进行序列化,并且只发出TypeNameHandling=TypeNameHandling.Auto类型的类型信息,而Dictionary则不会。相关地,在使用TypeNameHandling时,请注意Newtonsoft文档中的这条注释:当您的应用程序从外部源反序列化JSON时,应谨慎使用TypeNameHandling。使用None以外的值反序列化时,您应该使用自定义SerializationBindervalidation传入类型。请参阅NewtonsoftJson中的TypeNameHandlingWarnings以了解可能需要这样做的讨论。以上就是C#学习教程的全部内容:Newtonsoft.Json,PopulateDictionary分享失败。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: