首页 >后端开发 >C++ >如何在 System.Text.Json 中自定义序列化合约?

如何在 System.Text.Json 中自定义序列化合约?

Barbara Streisand
Barbara Streisand原创
2025-01-03 11:45:40705浏览

How Can I Customize Serialization Contracts in System.Text.Json?

在 System.Text.Json 中自定义序列化合约

新的 System.Text.Json API 提供了自定义序列化合约的功能,提供功能类似于 Newtonsoft 的 IContractResolver。

Contract .NET 7 中的自定义

在 .NET 7 中,可以通过 IJsonTypeInfoResolver 接口进行协定自定义。此接口允许开发人员创建自定义解析器,这些解析器返回指定类型和 JsonSerializerOptions 组合的已配置 JsonTypeInfo 实例。

创建自定义解析器

创建自定义解析器的一种方法是子类化 DefaultJsonTypeInfoResolver 并重写 GetTypeInfo(Type, JsonSerializerOptions) 方法。或者,您可以添加 Action添加到 DefaultJsonTypeInfoResolver.Modifiers 集合,以在创建后修改默认的 JsonTypeInfo。

示例:选择性字段序列化

复制 System.Text 中 SelectiveSerializer 类的功能。 Json,您可以使用类似于以下的修饰符操作以下:

resolver.Modifiers.Add(typeInfo =>
{
    if (typeInfo.Kind == JsonTypeInfoKind.Object)
    {
        foreach (var property in typeInfo.Properties)
        {
            if (property.GetMemberName() is {} name && !membersToSerializeSet.Contains(name))
                property.ShouldSerialize = static (obj, value) => false;
        }
    }
});

此修饰符检查与指定字段名称匹配的属性,并将其 ShouldSerialize 属性设置为 false 以将其排除在序列化之外。

设置解析器

创建自定义解析器后,可以通过JsonSerializerOptions.TypeInfoResolver 属性。例如:

var options = new JsonSerializerOptions
{
    TypeInfoResolver = new DefaultJsonTypeInfoResolver()
        .SerializeSelectedFields("FirstName,Email,Id"),
    // Other options as required
};

附加说明

  • PropertyNamePolicy 和 WriteIndented 可以设置自定义属性命名和缩进。
  • JsonPropertyInfo。 ShouldSerialize 可用于条件序列化属性。
  • System.Text.Json 默认区分大小写,因此在过滤选定字段时使用区分大小写的比较非常重要。

以上是如何在 System.Text.Json 中自定义序列化合约?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn