Heim >Backend-Entwicklung >C++ >Wie gehe ich mit JSON -Daten mit gemischten Einzel- und Array -Werten für dieselbe Eigenschaft um?

Wie gehe ich mit JSON -Daten mit gemischten Einzel- und Array -Werten für dieselbe Eigenschaft um?

Linda Hamilton
Linda HamiltonOriginal
2025-02-02 21:06:09266Durchsuche

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

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 Liste

und 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:

Dieser Konverter bestimmt, ob das in ein Array übergebene Etikett oder ein einzelnes Element entsprechend verarbeitet wird. Wenn es sich um ein Array handelt, konvertiert es es in eine neue Liste.

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>

Um einen benutzerdefinierten Konverter zu verwenden, aktualisieren Sie den Ableitungscode wie unten gezeigt:

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn