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.
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>
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 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>
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.
Untuk menyelesaikan masalah ini, penukar JSON tersuai diperlukan. TypedExtensionDataConverter
Menyelesaikan masalah ini dengan elegan. Berikut ialah kodnya:
<code class="language-csharp">public class TypedExtensionDataConverter<T> : JsonConverter { // ... [此处省略实现,篇幅原因] }</code>
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>
Dengan menggunakan JsonTypedExtensionDataAttribute
, penukar tahu untuk mensiri/menyahserialisasikan sifat yang tidak diketahui ke dalam kamus UserTable
.
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>
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!