Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menyahserialisasikan JSON dengan Kekunci Numerik Dinamik Menggunakan Newtonsoft.Json?

Bagaimana untuk Menyahserialisasikan JSON dengan Kekunci Numerik Dinamik Menggunakan Newtonsoft.Json?

DDD
Lepaskan: 2025-01-13 19:07:44
asal
693 orang telah melayarinya

How to Deserialize JSON with Dynamic Numeric Keys Using Newtonsoft.Json?

Bagaimana untuk menyahsiri sub-objek dengan nama kunci dinamik (numerik)?

Apabila berurusan dengan struktur JSON kompleks yang mengandungi sub-objek dengan nama kunci dinamik, penyahserikatannya menggunakan Newtonsoft JSON.NET boleh menimbulkan cabaran. Artikel ini akan menyelidiki senario yang melibatkan struktur sedemikian dan menyediakan penyelesaian lengkap menggunakan penukar JSON tersuai.

struktur JSON

Pertimbangkan struktur JSON berikut:

<code class="language-json">{
    "users" : {
        "parentname":"test",
        "100034" : {
            "name"  : "tom",
            "state" : "WA",
            "id"    : "cedf-c56f-18a4-4b1"
        },
        "10045" : {
            "name"  : "steve",
            "state" : "NY",
            "id"    : "ebb2-92bf-3062-7774"
        },
        "12345" : {
            "name"  : "mike",
            "state" : "MA",
            "id"    : "fb60-b34f-6dc8-aaf7"
        }
    }
}</code>
Salin selepas log masuk

Dalam struktur ini, objek "pengguna" mengandungi gabungan sifat yang diketahui ("nama ibu bapa") dan sifat yang tidak diketahui (dengan kekunci angka yang mewakili objek anak). Matlamatnya adalah untuk menyahsiri struktur ini menjadi model objek C#, di mana sub-objek diwakili sebagai kelas ditaip kuat.

Percubaan dan cabaran awal

Percubaan awal untuk menyahsiri JSON menggunakan kod JSON.NET standard mungkin kelihatan seperti ini:

<code class="language-csharp">class RootObject
{
    public string ParentName { get; set; }
    public Dictionary<string, User> users { get; set; }
}

class User
{
    public string name { get; set; }
    public string state { get; set; }
    public string id { get; set; }
}</code>
Salin selepas log masuk

Deserialisasi kepada model objek ini gagal kerana sifat yang tidak diketahui dalam objek "pengguna". JSON.NET secara lalai menjangkakan nama sifat sepadan dengan sifat kelas, dan oleh kerana kunci angka tidak sepadan dengan mana-mana harta dalam kelas Pengguna, proses penyahserialisasian gagal.

Penukar JSON tersuai

Untuk menyelesaikan masalah ini, penukar JSON tersuai diperlukan. TypedExtensionDataConverterMenyelesaikan masalah ini dengan elegan. Berikut ialah kodnya:

<code class="language-csharp">public class TypedExtensionDataConverter<T> : JsonConverter
{
    // ... [此处省略实现,篇幅原因]
}</code>
Salin selepas log masuk

Penukar ini membenarkan menyahsiri sifat yang tidak diketahui ke dalam bekas ditaip, dalam kes ini kamus objek Pengguna:

<code class="language-csharp">[JsonConverter(typeof(TypedExtensionDataConverter<Users>))]
class Users
{
    public Users()
    {
        this.UserTable = new Dictionary<string, User>();
    }

    [JsonProperty("parentname")]
    public string ParentName { get; set; }

    [JsonTypedExtensionData]
    public Dictionary<string, User> UserTable { get; set; }
}</code>
Salin selepas log masuk

Dengan menggunakan JsonTypedExtensionDataAttribute, penukar tahu untuk mensiri/menyahserialisasikan sifat yang tidak diketahui ke dalam kamus UserTable.

Penyelesaian Lengkap

Dengan penukar tersuai, penyelesaian lengkap kelihatan seperti ini:

<code class="language-csharp">class RootObject
{
    [JsonProperty("users")]
    public Users Users { get; set; }
}

[JsonConverter(typeof(TypedExtensionDataConverter<Users>))]
class Users
{
    // ... [如上实现]
}

class User
{
    // ... [不变]
}</code>
Salin selepas log masuk

Struktur JSON yang dinyahsiri kini akan mengisi RootObject dengan nilai yang dijangkakan, termasuk sub-objek yang disimpan dalam kamus Users dalam objek UserTable.

Atas ialah kandungan terperinci Bagaimana untuk Menyahserialisasikan JSON dengan Kekunci Numerik Dinamik Menggunakan Newtonsoft.Json?. 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