Heim > Backend-Entwicklung > C++ > Wie kann ich bei der Deserialisierung mit mehrdeutigen JSON-Arrays und -Objekten umgehen?

Wie kann ich bei der Deserialisierung mit mehrdeutigen JSON-Arrays und -Objekten umgehen?

Barbara Streisand
Freigeben: 2025-01-12 19:01:43
Original
483 Leute haben es durchsucht

How Can I Handle Ambiguous JSON Arrays and Objects During Deserialization?

JSON-Deserialisierung: Umgang mit mehrdeutigen Arrays und Objekten

Bei der Verarbeitung von JSON-Daten kommt es häufig zu strukturellen Inkonsistenzen. Einige Eigenschaften können in einer Instanz als Array und in einer anderen Instanz als Objekt dargestellt werden. Dies kann insbesondere bei Verwendung typsicherer Klassen zu Problemen bei der Deserialisierung führen.

Frage:

Bedenken Sie die folgenden von Facebook zurückgegebenen JSON-Daten:

  • Wandpost (Objekt):

    <code class="language-json">  {
        "description": "",
        "permalink": "..."
      }</code>
    Nach dem Login kopieren
  • Fotobeitrag (Array):

    <code class="language-json">  {
        "media": [
            {
                "href": "...",
                "src": "..."
            }
        ]
      }</code>
    Nach dem Login kopieren
  • Mobiler Pinnwandbeitrag (Objekt):

    <code class="language-json">  {
        "name": null,
        "caption": null,
        "media": {}
      }</code>
    Nach dem Login kopieren

Bei bewegten Wandbeiträgen wird die Eigenschaft „media“ als leeres Objekt statt als Array dargestellt. Dieser Unterschied führt dazu, dass die Deserialisierung fehlschlägt, wenn eine Klasse verwendet wird, die ein Array von „FacebookMedia“-Objekten erwartet.

Lösung: Benutzerdefinierter JSON-Konverter

Um diese Situation zu bewältigen, können wir einen benutzerdefinierten JSON-Konverter erstellen. Dieser Konverter untersucht die JSON-Struktur und gibt je nach Vorhandensein eines Arrays oder Objekts eine Liste oder Null zurück.

<code class="language-csharp">public class FacebookMediaJsonConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartArray)
            return serializer.Deserialize<List<FacebookMedia>>(reader);
        else
            return null;
    }

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

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<FacebookMedia>);
    }
}</code>
Nach dem Login kopieren

Verwendung:

Um einen Konverter zu verwenden, kommentieren Sie die Eigenschaften in Ihrer Klasse mit dem [JsonConverter]-Attribut:

<code class="language-csharp">[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List<FacebookMedia> Media { get; set; }</code>
Nach dem Login kopieren

Die Deserialisierung verarbeitet nun erfolgreich Arrays und Objekte der Eigenschaft „Medien“.

Erweiterungen für ein einzelnes Objekt:

Wenn Sie eine Liste auch mit nur einem Objekt erhalten möchten, können Sie den Konverter erweitern, um ein einzelnes Objekt in eine Liste umzuwandeln.

<code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        object result;
        if (reader.TokenType == JsonToken.StartObject)
        {
            T instance = (T)serializer.Deserialize(reader, typeof(T));
            result = new List<T> { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            result = serializer.Deserialize(reader, objectType);
        }
        else
        {
            throw new JsonSerializationException("Unexpected token type.");
        }
        return result;
    }

    // ... 转换器实现的其余部分 ...
}</code>
Nach dem Login kopieren

Durch die Verwendung eines benutzerdefinierten JSON-Konverters können wir Inkonsistenzen in der JSON-Struktur beheben und eine erfolgreiche Deserialisierung sicherstellen.

Das obige ist der detaillierte Inhalt vonWie kann ich bei der Deserialisierung mit mehrdeutigen JSON-Arrays und -Objekten umgehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage