<:> 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
[ { "email": "[email protected]", "timestamp": 1337966815, "category": [ "newuser", "transactional" ], "event": "open" }, { "email": "[email protected]", "timestamp": 1337966815, "category": "olduser", "event": "open" } ]
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:
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; } }
<法> penggunaan dan output
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(); } }
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!