Question:
Lors du traitement des données JSON, le même attribut peut souvent être exprimé en une seule valeur, ou il peut être représenté comme un tableau de valeur. Par exemple, les charges valides suivantes obtenues à partir de l'API SendGrid:
"Catégorie" L'attribut illustre ce problème. Pour certains projets, il s'agit d'une chaîne et pour d'autres éléments, c'est un tableau de chaîne. JSON.net fournit deux méthodes pour gérer cette incohérence: modifiez les données transmises ou configurez JSON.net pour accepter les différences.
[ { "email": "[email protected]", "timestamp": 1337966815, "category": [ "newuser", "transactional" ], "event": "open" }, { "email": "[email protected]", "timestamp": 1337966815, "category": "olduser", "event": "open" } ]
La méthode recommandée consiste à utiliser JSONConverrer personnalisé. Définissons une classe pour moderniser les données:
Pour les attributs qui peuvent être un seul élément ou un seul tableau (dans cet exemple, "catégorie"), nous le définissons comme listeet spécifions un convertisseur personnalisé pour traiter sa modification.
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; } }
;
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(); } }
Le programme sera correctement sérialisé les données JSON, et l'attribut "Catégorie" sera rempli de manière appropriée dans une liste de chaînes pour une seule situation et une seule situation.
Cette méthode fournit une méthode flexible pour traiter les données JSON avec la même propriété avec un type de valeur mixte.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!