首页 > 解决方案 > 使用 System.Text.Json 序列化 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; }
}

默认序列化

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

实际结果

{ "InternalId": 3, "FirstName": "Dorothy", "LastName": "Vaughan" }

预期结果

{ "FirstName": "Dorothy", "LastName": "Vaughan" }

无效的替代方案

还有两个关于如何在 RunTime 添加 JsonIgnore & add dynamic property name for serialization 的问题,但两者都针对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; }
}
var jsonString = System.Text.Json.JsonSerializer.Serialize(new MyFrozenClass(person));

标签: c#jsonserialization.net-coresystem.text.json

解决方案


推荐阅读