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

无法使用Json.NET 8.0.1反序列化具有字节数组属性的对象分享

时间:2023-04-10 13:27:36 C#

C#学习教程:无法使用Json.NET8.0.1反序列化具有字节数组属性的对象share在Json.NET8.0.1之后,部分反序列化会失败。Json.NET7.0.1一切正常。显然,导致问题的是byte[]类型的属性的反序列化。如果我删除byte[]属性,它就可以正常工作。我可以使用这个简单的控制台应用程序重现该行为:internalclassProgram{privatestaticvoidMain(string[]args){Dictionaryaccounts;varjsonSerializerSettings=newJsonSerializerSettings{TypeNameHandling=TypeNameHandling.Objects,TypeNameAssemblyFormat=FormatterAssemblyStyle.Simple};使用(varstreamReader=newStreamReader("accounts.json")){varjson=streamReader.ReadToEnd();accounts=JsonConvert.DeserializeObject(json,jsonSerializerSettings);}foreach(varaccountinaccounts){Debug.WriteLine(account.Value.Name);}}}internalclassAccount{publicstringId{get;放;}公共字符串名称{得到;放;}publicbyte[]EncryptedPassword{get;放;}}accounts.json文件如下所示:{"$type":"System.Collections.Generic.Dictionary`2[[System.String,mscorlib],[ConsoleApplication1.Account,ConsoleApplication1]],mscorlib","lars.michael":{"$type":"ConsoleApplication1.Account,ConsoleApplication1","EncryptedPassword":{"$type":"System.Byte[],mscorlib","$value":"cGFzc3dvcmQ="},"Name":"LarsMichael","Id":"lars.michael"},"john.doe":{"$type":"ConsoleApplication1.Account,ConsoleApplication1","EncryptedPassword":{"$type":"System.Byte[],mscorlib","$value":"cGFzc3dvcmQ="},"Name":"JohnDoe","Id":"john.doe"}}这可能是Json.NET8.0.1中的错误,还是可以通过调整JsonSerializerSettings来修复?如果有人试图重现此问题,请确保添加程序集名称控制台应用程序(在本例中为ConsoleApplication1)已与固定在变更集70120ce中的控制台应用程序的程序集名称(在本例中为ConsoleApplication1)同步更新,它将包含在Json.NET8.0.2中。原始答案证实-这似乎是一个回归。考虑以下简单的测试类:internalclassHasByteArray{publicbyte[]EncryptedPassword{get;{加密密码=转换。FromBase64String("cGFzc3dvcmQ=")};尝试{TestRoundTrip(测试);}catch(Exceptionex){Debug.WriteLine(ex);JsonSerializerSettings{TypeNameHandling=TypeNameHandling.Objects,TypeNameAssemblyFormat=FormatterAssemblyStyle.Simple};TestRoundTrip(项目,jsonSerializerSettings);}privatestaticvoidTestRoundTrip(Titem,JsonSerializerSettingsjsonSerializerSettings){varjson=JsonConvert.SerializeObject(item,Formatting.Indented,jsonSerializerSettings);调试.WriteLine(json);varitem2=JsonConvert.DeserializeObject(json,jsonSerializerSettings);varjson2=JsonConvert.SerializeObject(item2,Formatting.Indented,jsonSerializerSettingsings);调试.WriteLine(json2);如果(!JToken.DeepEquals(JToken.Parse(json),JToken.Parse(json2)))thrownewInvalidOperationException("RoundTripFailed");我得到以下异常:Newtonsoft.Json.JsonSerializationException:AdditionaltextfoundinJSONstringafterfinishingdeserializingobject.在C:DevelopmentReleasesJsonWorkingNewtonsoft.JsonWorking-SignedSrcNewtonsoft.JsonSerializationJsonSerializerInternalReader.cs中的Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReaderreader,TypeobjectType,BooleancheckAdditionalContent)中:第196行在Newtonsoft.Json.JsonSerializerreader.DeserJsonInterialize中在C:DevelopmentReleasesJsonWorkingNewtonsoft.JsonWorking-SignedSrcNewtonsoft.JsonJsonSerializer.cs:line823在Newtonsoft.Json.JsonSerializer.Deserialize(JsonReaderreader,TypeobjectType)在C:DevelopmentReleasesJsonWorkingNewtonsoft.JsonWorking-SignedSrcNewtonsoft.JsonJsonSerializer.cs:line802在C:DevelopmentReleasesJsonWorkingNewtonsoft.JsonWorking-SignedSrcNewtonsoft.JsonJsonConvert.cs中的Newtonsoft.Json.JsonConvert.DeserializeObject(字符串值,类型类型,JsonSerializerSettings设置):第863行在Newtonsoft.Json.JsonConvert.DeserializeObject[T](字符串值,JsonSerializerSettings设置)在C:DevelopmentReleasesJsonWorkingNewtonsoft.JsonWorking-SignedSrcNewtonsoft.JsonJsonConvert.cs:Question34654184.TestClass.TestRoundTrip[T](Titem,JsonSerializerSettingsjsonSerializerSettings)第820行,在Question34654184.TestClass.TestRoundTrip[T](T56TestitemClass14)TestSimple()Json7.0中不会发生异常您应该报告问题。在此期间,您可以使用以下转换工具来解决此问题:}publicoverrideobjectReadJson(JsonReaderreader,TypeobjectType,objectexistingValue,JsonSerializerserializer){if(reader.TokenType==JsonToken.Null)returnnull;vartoken=JToken.Load(阅读器);如果(令牌==null)返回null;switch(token.Type){caseJTokenType.Null:返回null;案例JTokenType.String:returnConvert.FromBase64String((string)token);caseJTokenType.Object:{varvalue=(string)token["$value"];返回值==空?null:Convert.FromBase64String(值);}默认:抛出新的JsonSerializationException(“未知字节数组格式”);}}publicoverrideboolCanWrite{get{returnfalse;}}//使用默认实现进行序列化,没有被破坏。publicoverridevoidWriteJson(JsonWriterwriter,objectvalue,JsonSerializerserializer){抛出新的NotImplementedException();}}设置好了,以上就是C#学习教程:Json.NET8.0.1不能用来反序列化字节数组属性的对象。分享所有内容,如果对大家有用,需要了解更多关于C#学习教程,希望大家多多关注—[]{newByteArrayConverter()},};代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: