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
Lepaskan: 2025-02-02 12:01:11
asal
485 orang telah melayarinya

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:

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

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

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 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan