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

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

DDD
Lepaskan: 2024-12-27 17:30:11
asal
1064 orang telah melayarinya

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);
}
Salin selepas log masuk

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);
        }
    }
    Salin selepas log masuk
  2. Add Action&pelt; Pengubah suai:

    var resolver = new DefaultJsonTypeInfoResolver();
    resolver.Modifiers.Add(typeInfo =>
    {
        // Modify the default JsonTypeInfo here
    });
    Salin selepas log masuk
  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);
        }
    }
    Salin selepas log masuk

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,
};
Salin selepas log masuk

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 Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan