【发布时间】: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"
}
【问题讨论】:
-
欢迎来到 StackOverflow!只是出于好奇,您是如何使用 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/…
标签: c# json .net serialization system.text.json