Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh melakukan polimorfik JSON deserialization dalam json.net tanpa maklumat jenis?

Bagaimanakah saya boleh melakukan polimorfik JSON deserialization dalam json.net tanpa maklumat jenis?

Barbara Streisand
Barbara Streisandasal
2025-02-02 12:01:11464semak imbas

How Can I Perform Polymorphic JSON Deserialization in Json.NET Without Type Information?

json.net tanpa maklumat jenis tanpa jenis maklumat.

Ciri kuat JSON.net membolehkan data JSON polymorphic Polymorphic walaupun tanpa maklumat jenis. Ini amat berguna apabila memproses sumber data pelbagai jenis jenis jenis, contohnya, IMGUR API juga mengembalikan keadaan imej galeri dan album galeri. Untuk mencapai matlamat ini, kami mencipta JsonConverter tersuai untuk mengendalikan proses instantiated. Pertama sekali, kami mentakrifkan kelas asas Galleryitem kami dan GalleryImage Kelas yang diperolehi dan Galleryalbum:

Seterusnya, kami menyedari jsonconverter kami, GalleryItemConverter:

<code class="language-csharp">public abstract class GalleryItem
{
    public string id { get; set; }
    public string title { get; set; }
    public string link { get; set; }
    public bool is_album { get; set; }
}

public class GalleryImage : GalleryItem
{
    // 附加的图像特定属性
}

public class GalleryAlbum : GalleryItem
{
    public int images_count { get; set; }
    public List<GalleryImage> images { get; set; }
}</code>
Pemeriksaan penukar sama ada terdapat harta "is_album" untuk menentukan jenis yang akan diberikan instantiated. Kemudian, ia mengisi atribut objek berdasarkan data dalam objek JSON.

Untuk menunjukkan penggunaannya, kami menentukan contoh data contoh yang disediakan oleh analisis:
<code class="language-csharp">public class GalleryItemConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(GalleryItem).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 解析包含数据的JSON对象
        JObject jo = JObject.Load(reader);

        // 检查是否存在"is_album"以确定对象类型
        bool? isAlbum = (bool?)jo["is_album"];

        GalleryItem item;
        if (isAlbum.GetValueOrDefault())
            item = new GalleryAlbum();
        else
            item = new GalleryImage();

        // 使用JsonSerializer填充对象的属性
        serializer.Populate(jo.CreateReader(), item);

        return item;
    }

    // 对于我们的目的,不需要实现CanWrite和WriteJson
}</code>

Output program menunjukkan kemerosotan yang berjaya dalam imej galeri dan objek album galeri, dan pengisian yang tepat dari atribut masing -masing.

Dengan cara ini, Custom JsonConverRter membolehkan kami memproses siri -siri JSON Polymorphic JSON tanpa maklumat jenis yang jelas, supaya kami dapat berkolaborasi dengan sumber data yang berbeza.
<code class="language-csharp">string json = @"
[
    {
        ""id"": ""OUHDm"",
        ""title"": ""My most recent drawing. Spent over 100 hours."",
        ""link"": ""http://i.imgur.com/OUHDm.jpg"",
        ""is_album"": false
    },
    {
        ""id"": ""lDRB2"",
        ""title"": ""Imgur Office"",
        ""link"": ""http://alanbox.imgur.com/a/lDRB2"",
        ""is_album"": true,
        ""images_count"": 3,
        ""images"": [
            {
                ""id"": ""24nLu"",
                ""link"": ""http://i.imgur.com/24nLu.jpg""
            },
            {
                ""id"": ""Ziz25"",
                ""link"": ""http://i.imgur.com/Ziz25.jpg""
            },
            {
                ""id"": ""9tzW6"",
                ""link"": ""http://i.imgur.com/9tzW6.jpg""
            }
        ]
    }
]";

List<GalleryItem> items = JsonConvert.DeserializeObject<List<GalleryItem>>(json, new GalleryItemConverter());</code>

Atas ialah kandungan terperinci Bagaimanakah saya boleh melakukan polimorfik JSON deserialization dalam json.net tanpa maklumat jenis?. 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