Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk mengendalikan array yang tidak konsisten di json.net apabila deserializing?

Bagaimana untuk mengendalikan array yang tidak konsisten di json.net apabila deserializing?

Susan Sarandon
Susan Sarandonasal
2025-02-02 20:56:09932semak imbas

How to Handle Inconsistent Arrays in JSON.NET When Deserializing?

menangani struktur array yang tidak konsisten dalam json.net deserialization

Data JSON Deserializing dengan JSON.NET boleh mengemukakan cabaran apabila harta yang tidak konsisten muncul sebagai nilai tunggal atau array merentasi objek yang berbeza dalam pelbagai JSON. Ini adalah senario yang sama, terutamanya apabila berinteraksi dengan API yang mengembalikan struktur data yang berbeza -beza. Contohnya, harta "kategori" kadang -kadang boleh menjadi rentetan tunggal dan masa lain pelbagai rentetan.

memanfaatkan jsonconverter adat

Penyelesaian yang paling mantap melibatkan membuat adat

. Ini membolehkan pengendalian fleksibel terhadap ketidakkonsistenan ini. Proses ini melibatkan langkah -langkah ini: JsonConverter

  1. Definisi Kelas Data: Buat kelas C# untuk mewakili data anda. Gunakan jenis untuk sifat -sifat yang mungkin nilai tunggal atau tatasusunan rentetan. Anotate harta ini dengan atribut List<string>, menyatakan penukar tersuai anda. [JsonConverter]

  2. Pelaksanaan JsonConverter Generik: Membangunkan generik yang mampu mengendalikan pelbagai jenis objek, termasuk rentetan. JsonConverter

  3. Kaedah: Melaksanakan kaedah ReadJson untuk menghuraikan data JSON dan memetakannya dengan betul ke jenis .NET yang sesuai, tanpa mengira sama ada harta JSON adalah satu nilai atau array. ReadJson

    Kaedah
  4. (pilihan): Kaedah WriteJson adalah pilihan. Melaksanakannya jika anda perlu menyatukan data kembali ke JSON, berpotensi mengekalkan format yang tidak konsisten asal. WriteJson

Contoh kod

Contoh ini mempamerkan penukar tersuai dalam tindakan:

Penukar adat ini membolehkan JSON.NET untuk mengendalikan harta yang tidak konsisten
<code class="language-csharp">// Data structure class
public class Item
{
    [JsonProperty("email")]
    public string Email { get; set; }

    [JsonProperty("timestamp")]
    public int Timestamp { get; set; }

    [JsonProperty("event")]
    public string Event { get; set; }

    [JsonProperty("category")]
    [JsonConverter(typeof(SingleOrArrayConverter<string>))]
    public List<string> Categories { get; set; } = new List<string>(); // Initialize to avoid null
}

// Generic converter
public class SingleOrArrayConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        // Check if the type is a List<T> or T
        return objectType == typeof(List<T>) || objectType == typeof(T);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartArray)
        {
            var list = new List<T>();
            while (reader.Read() && reader.TokenType != JsonToken.EndArray)
            {
                list.Add(serializer.Deserialize<T>(reader));
            }
            return list;
        }
        else
        {
            return serializer.Deserialize<T>(reader);
        }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value is List<T> list)
        {
            writer.WriteStartArray();
            foreach (var item in list)
            {
                serializer.Serialize(writer, item);
            }
            writer.WriteEndArray();
        }
        else
        {
            serializer.Serialize(writer, value);
        }
    }
}</code>
yang tidak konsisten, menyediakan proses deserialization yang lebih mantap dan fleksibel. Ingatlah untuk mengendalikan nilai null yang berpotensi dengan sewajarnya dalam kaedah

anda. category

Atas ialah kandungan terperinci Bagaimana untuk mengendalikan array yang tidak konsisten di json.net apabila deserializing?. 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