使用 System.Text.Json 序列化 JSON 时动态忽略密封类上的属性

Kyl*_*Mit 13 c# serialization json .net-core system.text.json

问题

我可以使用动态忽略密封类中的属性吗System.Text.Json.JsonSerializer

示例代码

来自另一个库的示例类

public sealed class FrozenClass
{
    // [JsonIgnore] <- cannot apply because I don't own this class
    public int InternalId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

默认序列化

var person = new FrozenClass() { InternalId = 3, FirstName = "Dorothy", LastName = "Vaughan" };
var jsonString = System.Text.Json.JsonSerializer.Serialize(person);
Run Code Online (Sandbox Code Playgroud)

实际结果

{ "InternalId": 3, "FirstName": "Dorothy", "LastName": "Vaughan" }
Run Code Online (Sandbox Code Playgroud)

预期结果

{ "FirstName": "Dorothy", "LastName": "Vaughan" }
Run Code Online (Sandbox Code Playgroud)

不起作用的替代方案

还有另外两个问题是关于如何在运行时添加 JsonIgnore添加动态属性名称进行序列化,但这两个问题都是针对Newtonsoft 的 Json.NET - 并且经常引用此扩展方法

有多种方法可以修改类与 native 的序列化方式JsonSerializer,但似乎都依赖于修改底层类:

但是,就我而言,该类来自另一个库,无法扩展

解决方法

一种可能的解决方法是创建另一个可导出类并在它们之间设置一个映射器

public class MyFrozenClass
{
    public MyFrozenClass(FrozenClass frozen)
    {
        this.FirstName = frozen.FirstName;
        this.LastName = frozen.LastName;
    }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
var jsonString = System.Text.Json.JsonSerializer.Serialize(new MyFrozenClass(person));
Run Code Online (Sandbox Code Playgroud)

归档时间:

查看次数:

4119 次

最近记录:

5 年,7 月 前