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

Json.NET – 阻止重新序列化已经序列化的属性分享

时间:2023-04-10 13:35:25 C#

C#学习教程:Json.NET-防止序列化属性的再序列化仅在客户端。在服务器上,它只是作为字符串传入和传出关系数据库。性能是关键,根本不需要在服务器端处理JSON字符串。所以在C#中,想象这样一个对象:newPerson{FirstName="John",LastName="Smith",Json="{"Age":30}"};默认情况下,Json.NET看起来像这样序列化此对象:{"FirstName":"John","LastName":"Smith","Json":"{"Age":30}"}我想成为能够指示Json.NET假定Json属性已经是一个序列表示,因此不应将其重新序列化,生成的JSON应如下所示:{"FirstName":"John","LastName":"Smith","Json":{"Age":30}}理想情况下,这在两个方向上都有效,即当发布JSON表示时,它将自动反序列化为上述C#表示。使用Json.NET实现此目的的最佳机制是什么?我需要自定义JsonConverter吗?有没有更简单的基于属性的机制?效率很重要;重点是跳过序列化开销,这可能是一个微优化,但为了争论起见,我们假设它不是。(可能会返回一个包含大量Json属性的大列表。)如果您能够将Person上的Json属性的类型从字符串更改为JRaw,那么您将获得所需的结果。publicclassPerson{publicstringFirstName{get;设置;}公共字符串姓氏{得到;设置;}公共JRawJson{得到;set;}}或者,您可以保留字符串属性并添加一个JRaw属性以用于序列化Proxyfor:publicclassPerson{publicstringFirstName{get;设置;}公共字符串姓氏{得到;设置;}[JsonIgnore]公共字符串Json{得到;放;}[JsonProperty("Json")]privateJRawMyJson{get{returnnewJRaw(this.Json);}设置{this.Json=value.ToString();无论哪种方式,序列化和反序列化都可以按照您的意愿进行。我不确定它是否非常有用,但您可以像这样创建一个自定义转换器:}publicoverridevoidWriteJson(JsonWriterwriter,objectvalue,JsonSerializerserializer){varo=JsonConvert.DeserializeObject(value.ToString());serializer.Serialize(writer,o);}publicoverrideobjectReadJson(JsonReaderreader,TypeobjectType,objectexistingValue,JsonSerializerserializer){varo=serializer.Deserialize(reader);返回JsonConvert.SerializeObject(o);现在,如果你用[JsonConverter(typeof(StringToJsonConverter))]装饰你的Json属性,你可以这样做:varobj=newPerson{FirstName="John",LastName="Smith",Json="{"Age":30}"};vars=JsonConvert.SerializeObject(obj);得到这个:{“FirstName”:“John”,“LastName”:“Smith”,“Json”:{“Age”:30}}这是一个小提琴,但我的小提琴中有一个音符,我在序列化和反序列化,但是Json中的属性值不完全一样。为什么?因为在这个过程中花括号周围的额外空间被剥离了。当然,它们并不(或不应该)重要。我不确定是否有跳过序列化的方法。这是一个以简单的方式序列化和反序列化的选项。以上就是C#学习教程:Json.NET-Preventreserializationofserializedproperties。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——publicclassPerson{publicstringFirstName="John";publicstringLastName="Smith";[JsonIgnore]publicstringJson="{"Age":30}";publicJObjectJsonP{get{返回JsonConvert.DeserializeObject(Json);}}}本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: