Heim >Backend-Entwicklung >C++ >Wie gehe ich mit JSON -Daten mit gemischten Einzel- und Array -Werten für dieselbe Eigenschaft um?
JSON -Daten
<:> Frage:
Bei der Verarbeitung von JSON -Daten kann das gleiche Attribut häufig als einzelner Wert ausgedrückt werden oder als Wertschrägerung dargestellt werden. Zum Beispiel die folgenden gültigen Lasten, die von SendGrid API erhalten wurden:
"Kategorie" -Matchtribut veranschaulicht dieses Problem. Für bestimmte Projekte handelt es sich um eine Zeichenfolge, und für andere Elemente handelt es sich um ein String -Array. JSON.NET stellt zwei Methoden zur Verfügung, um diese Inkonsistenz umzugehen: Ändern Sie die übertragenen Daten oder konfigurieren Sie JSON.NET, um Unterschiede zu akzeptieren.
<code class="language-json">[ { "email": "[email protected]", "timestamp": 1337966815, "category": [ "newuser", "transactional" ], "event": "open" }, { "email": "[email protected]", "timestamp": 1337966815, "category": "olduser", "event": "open" } ]</code>Lösung: JsonConveter
Die empfohlene Methode besteht darin, benutzerdefinierte JsonConverrer zu verwenden. Lassen Sie uns eine Klasse definieren, um Daten nachzurüsten:
Für die Attribute, die ein einzelnes Element oder ein Array sein können (in diesem Beispiel "Kategorie"), definieren wir es als Listeund geben einen benutzerdefinierten Konverter an, um seine Nachrüstung zu verarbeiten.
<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>Folgendes ist die Implementierung des Konverters:
Verwendung und Ausgabe
<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>
Das Programm ist korrekt serialisiert JSON -Daten, und das Attribut "Kategorie" wird für eine einzelne Situation und eine Array -Situation angemessen in eine Zeichenfolgenliste gefüllt.
Diese Methode bietet eine flexible Methode, um JSON -Daten mit derselben Eigenschaft mit einem gemischten Wert zu verarbeiten.Das obige ist der detaillierte Inhalt vonWie gehe ich mit JSON -Daten mit gemischten Einzel- und Array -Werten für dieselbe Eigenschaft um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!