Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mengendalikan Tatasusunan dan Objek JSON Samar-samar Semasa Penyahserialisasian?

Bagaimanakah Saya Boleh Mengendalikan Tatasusunan dan Objek JSON Samar-samar Semasa Penyahserialisasian?

Barbara Streisand
Lepaskan: 2025-01-12 19:01:43
asal
524 orang telah melayarinya

How Can I Handle Ambiguous JSON Arrays and Objects During Deserialization?

Penyahserialisasian JSON: Mengendalikan Tatasusunan dan Objek Kabur

Apabila memproses data JSON, anda sering menghadapi ketidakkonsistenan struktur. Sesetengah sifat boleh diwakili sebagai tatasusunan dalam satu contoh dan sebagai objek dalam contoh lain. Ini boleh menyebabkan masalah semasa penyahserikatan, terutamanya apabila menggunakan kelas selamat jenis.

Soalan:

Pertimbangkan data JSON berikut yang dikembalikan oleh Facebook:

  • Tiang dinding (objek):

    <code class="language-json">  {
        "description": "",
        "permalink": "..."
      }</code>
    Salin selepas log masuk
  • Siaran foto (susun):

    <code class="language-json">  {
        "media": [
            {
                "href": "...",
                "src": "..."
            }
        ]
      }</code>
    Salin selepas log masuk
  • Siaran dinding mudah alih (objek):

    <code class="language-json">  {
        "name": null,
        "caption": null,
        "media": {}
      }</code>
    Salin selepas log masuk

Dalam kes mengalihkan tiang dinding, sifat "media" diwakili sebagai objek kosong dan bukannya tatasusunan. Perbezaan ini menyebabkan penyahserikatan gagal apabila menggunakan kelas yang menjangkakan tatasusunan objek "FacebookMedia".

Penyelesaian: Penukar JSON Tersuai

Untuk mengendalikan situasi ini, kami boleh mencipta penukar JSON tersuai. Penukar ini akan memeriksa struktur JSON dan mengembalikan senarai atau null bergantung pada kehadiran tatasusunan atau objek.

<code class="language-csharp">public class FacebookMediaJsonConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartArray)
            return serializer.Deserialize<List<FacebookMedia>>(reader);
        else
            return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<FacebookMedia>);
    }
}</code>
Salin selepas log masuk

Penggunaan:

Untuk menggunakan penukar, anotasi sifat dalam kelas anda dengan atribut [JsonConverter]:

<code class="language-csharp">[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List<FacebookMedia> Media { get; set; }</code>
Salin selepas log masuk

Deserialisasi kini akan berjaya mengendalikan tatasusunan dan objek sifat "Media".

Sambungan untuk satu objek:

Jika anda ingin menerima senarai walaupun dengan hanya satu objek, anda boleh melanjutkan penukar untuk menukar satu objek kepada senarai.

<code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        object result;
        if (reader.TokenType == JsonToken.StartObject)
        {
            T instance = (T)serializer.Deserialize(reader, typeof(T));
            result = new List<T> { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            result = serializer.Deserialize(reader, objectType);
        }
        else
        {
            throw new JsonSerializationException("Unexpected token type.");
        }
        return result;
    }

    // ... 转换器实现的其余部分 ...
}</code>
Salin selepas log masuk

Dengan menggunakan penukar JSON tersuai, kami boleh menangani ketidakkonsistenan dalam struktur JSON dan memastikan penyahserikatan berjaya.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Tatasusunan dan Objek JSON Samar-samar Semasa Penyahserialisasian?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan