Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mensiri Kelas Terbitan Senarai dengan Ahli Tambahan Menggunakan Json.NET?

Bagaimana untuk Mensiri Kelas Terbitan Senarai dengan Ahli Tambahan Menggunakan Json.NET?

DDD
Lepaskan: 2025-01-07 13:07:41
asal
387 orang telah melayarinya

How to Serialize a List-Derived Class with Additional Members Using Json.NET?

Cara Mensiri Ahli Kelas yang Diperolehi daripada Senarai Menggunakan Json.net

Untuk memudahkan kerja dengan komponen tertentu, adalah perlu untuk mendapatkan kelas baharu, PagedResult, daripada List dan termasuk ahli tambahan. Walau bagaimanapun, apabila menjalankan penyahserialisasi JSON, hanya senarai itu bersiri. Menggunakan atribut [JsonObject] dan [JsonProperty] pada kelas terbitan hanya menyerikan ahli kelas terbitan, tidak termasuk senarai. Artikel ini meneroka cara untuk menyerikan kedua-dua senarai dan ahli kelas terbitannya.

Json.Net memperlakukan kelas yang melaksanakan IEnumerable sebagai tatasusunan secara lalai. Semasa menghias kelas dengan atribut [JsonObject] boleh mengatasi tingkah laku ini, ia hanya mensiri sifat objek, meninggalkan senarai tidak bersiri. Ini kerana senarai itu tidak boleh diakses melalui harta awam tetapi melalui kaedah GetEnumerator().

Untuk memasukkan kedua-duanya, anda boleh sama ada menjadikan harta awam dalam kelas terbitan anda boleh diakses oleh senarai, seperti yang dicadangkan oleh @ Konrad, atau buat JsonConverter tersuai untuk mensiri keseluruhan objek. Di bawah ialah contoh:

Andaikan PagedResult wujud sebagai:

class PagedResult<T> : List<T>
{
    public int PageSize { get; set; }
    public int PageIndex { get; set; }
    public int TotalItems { get; set; }
    public int TotalPages { get; set; }
}
Salin selepas log masuk

Begini cara membuat penukar tersuai:

class PagedResultConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(PagedResult<T>));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        PagedResult<T> result = (PagedResult<T>)value;
        JObject jo = new JObject();
        jo.Add("PageSize", result.PageSize);
        jo.Add("PageIndex", result.PageIndex);
        jo.Add("TotalItems", result.TotalItems);
        jo.Add("TotalPages", result.TotalPages);
        jo.Add("Items", JArray.FromObject(result.ToArray(), serializer));
        jo.WriteTo(writer);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        PagedResult<T> result = new PagedResult<T>();
        result.PageSize = (int)jo["PageSize"];
        result.PageIndex = (int)jo["PageIndex"];
        result.TotalItems = (int)jo["TotalItems"];
        result.TotalPages = (int)jo["TotalPages"];
        result.AddRange(jo["Items"].ToObject<T[]>(serializer));
        return result;
    }
}
Salin selepas log masuk

(Perhatikan bahawa [JsonObject] dan [JsonProperty] tidak diperlukan dengan pendekatan ini, kerana pengetahuan tentang apa yang hendak disirikan dikodkan dalam kelas penukar.)

Di bawah ialah demonstrasi menggunakan penukar:

class Program
{
    static void Main(string[] args)
    {
        PagedResult<string> result = new PagedResult<string> { "foo", "bar", "baz" };
        result.PageIndex = 0;
        result.PageSize = 10;
        result.TotalItems = 3;
        result.TotalPages = 1;

        JsonSerializerSettings settings = new JsonSerializerSettings();
        settings.Converters.Add(new PagedResultConverter<string>());
        settings.Formatting = Formatting.Indented;

        string json = JsonConvert.SerializeObject(result, settings);
        Console.WriteLine(json);
    }
}
Salin selepas log masuk

Output:

{
  "PageSize": 10,
  "PageIndex": 0,
  "TotalItems": 3,
  "TotalPages": 1,
  "Items": [
    "foo",
    "bar",
    "baz"
  ]
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mensiri Kelas Terbitan Senarai dengan Ahli Tambahan Menggunakan Json.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