Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk mengendalikan data JSON dengan nilai tunggal dan array campuran untuk harta yang sama?

Bagaimana untuk mengendalikan data JSON dengan nilai tunggal dan array campuran untuk harta yang sama?

Linda Hamilton
Linda Hamiltonasal
2025-02-02 21:06:09374semak imbas

How to Handle JSON Data with Mixed Single and Array Values for the Same Property?

data json

<:> Soalan:

Apabila memproses data JSON, atribut yang sama sering boleh dinyatakan sebagai nilai tunggal, atau ia boleh diwakili sebagai array nilai. Sebagai contoh, beban sah berikut yang diperolehi daripada Sendgrid API:

Atribut "kategori" menggambarkan masalah ini. Untuk projek -projek tertentu, ia adalah rentetan, dan untuk item lain, ia adalah array rentetan. JSON.NET menyediakan dua kaedah untuk menangani ketidakkonsistenan ini: mengubah data yang dihantar atau mengkonfigurasi JSON.NET untuk menerima perbezaan.

Penyelesaian: jsonconveter
<code class="language-json">[
  {
    "email": "[email protected]",
    "timestamp": 1337966815,
    "category": [
      "newuser",
      "transactional"
    ],
    "event": "open"
  },
  {
    "email": "[email protected]",
    "timestamp": 1337966815,
    "category": "olduser",
    "event": "open"
  }
]</code>

Kaedah yang disyorkan adalah menggunakan JsonConverrer adat. Marilah kita menentukan kelas untuk mengubah data:

Untuk atribut yang mungkin satu item atau array (dalam contoh ini, "kategori"), kami mentakrifkannya sebagai senarai

dan menentukan penukar tersuai untuk memproses retrofitnya.

Berikut adalah pelaksanaan penukar:
<code class="language-csharp">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; }
}</code>

Penukar ini menentukan sama ada label yang diluluskan ke dalam array atau satu item diproses dengan sewajarnya. Jika ia adalah array, ia menukarkannya ke senarai

;

penggunaan dan output
<code class="language-csharp">class SingleOrArrayConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(List<T>));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if (token.Type == JTokenType.Array)
        {
            return token.ToObject<List<T>>();
        }
        if (token.Type == JTokenType.Null)
        {
            return null;
        }
        return new List<T> { token.ToObject<T>() };
    }

    public override bool CanWrite
    {
        get { return false; }
    }

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

Untuk menggunakan penukar tersuai, sila kemas kini kod derivatif seperti yang ditunjukkan di bawah:

Program ini akan disiarkan dengan betul data JSON, dan atribut "kategori" akan diisi dengan sewajarnya ke dalam senarai rentetan untuk situasi tunggal dan situasi array.

Kaedah ini menyediakan kaedah yang fleksibel untuk memproses data JSON dengan harta yang sama dengan jenis nilai campuran.

Atas ialah kandungan terperinci Bagaimana untuk mengendalikan data JSON dengan nilai tunggal dan array campuran untuk harta yang sama?. 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