Rumah >pembangunan bahagian belakang >C++ >Bolehkah `IJsonTypeInfoResolver` System.Text.Json Mencapai Fungsi `IContractResolver`?

Bolehkah `IJsonTypeInfoResolver` System.Text.Json Mencapai Fungsi `IContractResolver`?

DDD
DDDasal
2024-12-27 17:30:111012semak imbas

Can System.Text.Json's `IJsonTypeInfoResolver` Achieve the Functionality of `IContractResolver`?

Bolehkah System.Text.Json Mimic IContractResolver?

Dalam ruang nama System.Text.Json, penyesuaian kontrak sangat dijangkakan dalam .NET 7 dan kini tersedia dalam Pratonton 6. Metadata kontrak untuk jenis tertentu, diwakili oleh JsonTypeInfo, kini boleh disesuaikan oleh pembangun.

public interface IJsonTypeInfoResolver
{
    JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options);
}

Membuat IJsonTypeInfoResolver Tersuai

Berikut ialah beberapa kaedah untuk mencipta tersuai anda IJsonTypeInfoResolver:

  1. Subclass DefaultJsonTypeInfoResolver:

    public class CustomJsonTypeInfoResolver : DefaultJsonTypeInfoResolver
    {
        public override JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options)
        {
            // Implement your custom logic here
            return base.GetTypeInfo(type, options);
        }
    }
  2. Add Action&pelt; Pengubah suai:

    var resolver = new DefaultJsonTypeInfoResolver();
    resolver.Modifiers.Add(typeInfo =>
    {
        // Modify the default JsonTypeInfo here
    });
  3. Buat IJsonTypeInfoResolver Baharu:

    public class CustomJsonTypeInfoResolver : IJsonTypeInfoResolver
    {
        public JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options)
        {
            // Implement your custom logic here
            return new JsonTypeInfo(type, JsonTypeInfoKind.Object);
        }
    }

Menggunakan Adat Anda Penyelesai

Setelah anda mempunyai penyelesai tersuai, tetapkannya melalui JsonSerializerOptions.TypeInfoResolver.

Contoh

Contoh berikut menunjukkan cara membuat DefaultJsonTypeInfoResolver yang bersiri hanya dipilih medan:

using System.Text.Json.Serialization;

public static class JsonSerializerExtensions
{
    public static DefaultJsonTypeInfoResolver SerializeSelectedFields(this DefaultJsonTypeInfoResolver resolver, IEnumerable<string> membersToSerialize)
    {
        resolver.Modifiers.Add(typeInfo =>
        {
            if (typeInfo.Kind == JsonTypeInfoKind.Object)
            {
                foreach (var property in typeInfo.Properties)
                {
                    if (!membersToSerialize.Contains(property.GetMemberName()))
                        property.ShouldSerialize = static (obj, value) => false;
                }
            }
        });

        return resolver;
    }
}

// Usage
var options = new JsonSerializerOptions
{
    TypeInfoResolver = new DefaultJsonTypeInfoResolver()
        .SerializeSelectedFields("FirstName", "Email", "Id"),
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    WriteIndented = true,
};

Atas ialah kandungan terperinci Bolehkah `IJsonTypeInfoResolver` System.Text.Json Mencapai Fungsi `IContractResolver`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn