Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menyahserialisasikan JSON Bersarang menjadi Kamus Bersarang dengan Diskriminasi Jenis dalam Teras .NET?

Bagaimana untuk Menyahserialisasikan JSON Bersarang menjadi Kamus Bersarang dengan Diskriminasi Jenis dalam Teras .NET?

DDD
Lepaskan: 2024-12-29 08:04:13
asal
892 orang telah melayarinya

How to Deserialize Nested JSON into a Nested Dictionary with Type Discrimination in .NET Core?

Penyahserialisasian Nested JSON ke dalam Nested Dictionary dengan Diskriminasi Jenis

Dalam .NET Core 3.1, System.Text.Json menyediakan cara standard untuk menyahsiri JSON. Secara lalai, objek JSON dinyahsiri menjadi objek JsonElement, yang menyediakan akses kepada struktur data JSON tetapi tidak menukar nilai secara automatik kepada jenis C# yang sepadan.

Masalah:

Matlamatnya adalah untuk menyahsiri objek JSON bersarang ke dalam Kamus, tetapi dengan diskriminasi jenis berikut untuk Nilai sifat JSON:

  • Rentetan sebagai rentetan
  • Nombor sebagai int/ganda
  • Objek sebagai Kamus

Penyelesaian:

Untuk mencapai matlamat ini, JsonConverter tersuai yang dipanggil ObjectAsPrimitiveConverter adalah perlu, kerana System.Text.Json tidak menyediakan kefungsian luar kotak untuk penukaran jenis khusus ini.

ObjectAsPrimitiveConverter menyediakan keupayaan berikut:

  • Sedar jenis penyahserikatan:

    • Menukar rentetan sebagai rentetan
    • Menukar nombor sebagai int/ganda berdasarkan format yang boleh dikonfigurasikan pengguna
    • Menukar objek sebagai Kamus
  • Pengendalian nombor:

    • Menyokong ketepatan dua kali ganda atau perpuluhan untuk nombor titik terapung
    • Termasuk pilihan untuk mengendalikan nombor yang tidak disokong sebagai JsonElements atau throw pengecualian
  • Pengendalian objek:

    • Membenarkan pengguna memilih antara menggunakan Kamus atau ExpandoObject untuk objek

Pelaksanaan:

public class ObjectAsPrimitiveConverter : JsonConverter<object>
{
    // Configuration options
    FloatFormat FloatFormat { get; init; }
    UnknownNumberFormat UnknownNumberFormat { get; init; }
    ObjectFormat ObjectFormat { get; init; }

    public ObjectAsPrimitiveConverter()
        : this(FloatFormat.Double, UnknownNumberFormat.Error, ObjectFormat.Expando)
    {
    }

    public ObjectAsPrimitiveConverter(
        FloatFormat floatFormat,
        UnknownNumberFormat unknownNumberFormat,
        ObjectFormat objectFormat)
    {
        this.FloatFormat = floatFormat;
        this.UnknownNumberFormat = unknownNumberFormat;
        this.ObjectFormat = objectFormat;
    }

    // ... implementation details ...
}

public enum FloatFormat
{
    Double,
    Decimal,
}

public enum UnknownNumberFormat
{
    Error,
    JsonElement,
}

public enum ObjectFormat
{
    Expando,
    Dictionary,
}
Salin selepas log masuk

Penggunaan:

Untuk menyahsiri JSON menjadi objek dinamik (atau ExpandoObject jika dikonfigurasikan) menggunakan ObjectAsPrimitiveConverter, nyatakan penukar dalam JsonSerializerOptions seperti ini:

var options = new JsonSerializerOptions
{
    Converters = { new ObjectAsPrimitiveConverter(floatFormat : FloatFormat.Double, unknownNumberFormat : UnknownNumberFormat.Error, objectFormat : ObjectFormat.Expando) },
    WriteIndented = true,
};
dynamic d = JsonSerializer.Deserialize<dynamic>(json, options);
Salin selepas log masuk

Nota:

  • JSON membenarkan bilangan ketepatan dan magnitud arbitrari, manakala .NET jenis angka primitif tidak. Dalam kes di mana nombor JSON tidak boleh dihuraikan menjadi jenis primitif .NET, penukar menyediakan pilihan untuk mengembalikan JsonElement untuk nombor itu atau membuang pengecualian.
  • Penukar boleh dikonfigurasikan untuk menggunakan ketepatan dua kali ganda atau perpuluhan untuk nombor titik terapung dan Kamus atau ExpandoObject untuk objek JSON.

Atas ialah kandungan terperinci Bagaimana untuk Menyahserialisasikan JSON Bersarang menjadi Kamus Bersarang dengan Diskriminasi Jenis dalam Teras .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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