System.Json - 属性序列化跳过的自定义规则
Posted
技术标签:
【中文标题】System.Json - 属性序列化跳过的自定义规则【英文标题】:System.Json - custom rules for property serialization skipping 【发布时间】:2021-12-12 12:55:03 【问题描述】:我正在尝试从 Newtonsoft.Json 迁移到 System.Text.Json 但是,由于我使用的是 DefaultContractResolver,所以我遇到了一个问题。 我的“自定义”行为有这些属性序列化规则:
-
如果用 ReadOnly 属性标记,则跳过属性序列化
在 null 的情况下跳过属性序列化(支持)
跳过将序列化为空对象的属性序列化
例子:
class Car
[ReadOnly]
public string Id get; set;
public string Name get; set;
public Person Owner get; set;
class Person
[ReadOnly]
public string Id get; set;
public string Name get; set;
现在,想象一下,如果没有适用的规则,我们就有了这些数据。
"Id":"1234",
"Name":"Skoda",
"Owner":
"Id":"abcd",
"Name":null
现在,如果我序列化对象,我希望得到它。
"Name":"Skoda"
【问题讨论】:
欢迎来到 ***!只是出于好奇,您是如何使用 Json.Net 解决这个问题的? 顺便说一句,对于 System.Text.Json,您有以下设置JsonSerializerOptions.IgnoreReadOnlyProperties
和 JsonSerializerOptions.IgnoreNullValues
在 Json.NET 中,我重写了 DefaultContractResolver 的 CreateProperty 方法。这样我设置了 ShouldSerialize 标志。我实际上是在尝试使用相同的规则首先反序列化该属性以了解它是否为空。当然,这对性能不好,但对我的解决方案来说很好。
System.Text.Json 没有简单的方法来完成所有工作,因为它的元数据是私有的。见System.Text.Json API is there something like IContractResolver,Open up metadata infrastructure of System.Text.Json #34456Equivalent of DefaultContractResolver in System.Text.Json #31257,
你也许可以通过使用 Dahomey.Json 来解决这个问题:github.com/dahomey-technologies/…
【参考方案1】:
为了忽略单个属性,您需要使用[JsonIgnore]
属性以及以下条件之一:
Always
;
Never
;
WhenWritingDefault
;
WhenWritingNull
。
您还可以通过JsonSerializerOptions
类型定义默认忽略条件。
如果需要额外的行为,你应该编写一个自定义转换器。
例子:
class Person
[JsonIgnore(Condition = JsonIgnoreCondition.Always)]
public string Id get; set;
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string Name get; set;
更多信息:
How to ignore properties with System.Text.Json
How to write custom converters for JSON serialization (marshalling) in .NET
【讨论】:
谢谢,但 [JsonIgnore] 无法解决我的问题。我需要它只忽略序列化,而不是反序列化。我想添加自定义转换器,但我需要为任何类型添加自定义转换器。基本上,对于任何类型,检查它是否为空(将序列化为“”)或具有特定属性,如果是,则跳过它,如果不是,应用标准转换器。以上是关于System.Json - 属性序列化跳过的自定义规则的主要内容,如果未能解决你的问题,请参考以下文章