首頁 > 後端開發 > C++ > 如何在 System.Text.Json 中自訂序列化合約?

如何在 System.Text.Json 中自訂序列化合約?

Barbara Streisand
發布: 2025-01-03 11:45:40
原創
703 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板