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
Barbara Streisandasal
2025-01-12 19:01:43479semak imbas

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>
  • Siaran foto (susun):

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

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

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>

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>

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>

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!

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