c# - 使用 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
,但似乎都依赖于修改底层类:
- 您可以通过将属性添加到原始类来从序列化中排除属性
[JsonIgnore]
- 您可以通过将属性添加到原始类来在属性上注册 JsonConverter
[JsonConverter]
但是,就我而言,该类来自另一个库,无法扩展
解决方法
一种可能的解决方法是创建另一个可导出类并在它们之间设置映射器
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));
解决方案
推荐阅读
- php - PHPOffice/PHPWord - 如何设置横向纸张大小
- angular - 如何使用 HP Engage One Prime 收据打印机打印收据
- html - 如何将 flexbox 项目包装到下一行?
- javascript - Snowflake 如何优化循环遍历数组并插入到卫星表中的 JavaScript 程序,这会减慢程序的速度?
- awk - 多个条件存储在变量中并在 awk 中用作 if 条件
- unit-testing - 我应该首先使用 Android Clean Architecture (TDD) 测试什么
- mysql - How to query for Null or Missing Fields in Mysql X DevAPI?
- javascript - 如何在 React JS 中找到两个时间戳之间的时间?
- firebase - 写入 Firestore 时,我怎么知道所有触发都已完成?
- java - 我想使用 Itext 将 HTML 转换为 pdf。Itext 正在将 HTML 转换为 pdf,但它没有将印地语字符打印成 PDF