„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie kann ich während der Deserialisierung mehrdeutige JSON -Arrays und -objekte umgehen?

Wie kann ich während der Deserialisierung mehrdeutige JSON -Arrays und -objekte umgehen?

Gepostet am 2025-02-06
Durchsuche:321

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

json Deserialisierung: Verwandte mehrdeutige Arrays und Objekte

Bei der Verarbeitung von JSON -Daten begegnen Sie häufig strukturelle Inkonsistenz. Einige Eigenschaften können in einer Instanz und als Objekte in einem anderen als Arrays dargestellt werden. Dies kann während der Deserialisierung zu Problemen führen, insbesondere bei der Verwendung von Typen-Sicherheit-Klassen.

Frage:

Betrachten Sie die folgenden JSON -Daten, die von Facebook zurückgegeben wurden:

  • wall posts (Objekt):

    ]]
      {
        "description": "",
        "permalink": "..."
      }
  • foto posts (array):

      {
        "media": [
            {
                "href": "...",
                "src": "..."
            }
        ]
      }
  • Mobile Wandposts (Objekt):

      {
        "name": null,
        "caption": null,
        "media": {}
      }

Im Fall von Wall -Posts wird das Attribut "Medien" als leeres Objekt anstelle eines Arrays dargestellt. Dieser Unterschied bewirkt, dass die Deserialisierung fehlschlägt, wenn eine Klasse verwendet wird, die ein Array von "FacebookMedia" -Objekten erwartet.

Lösung: benutzerdefinierte JSON Converter

Um diese Situation zu bewältigen, können wir einen benutzerdefinierten JSON -Konverter erstellen. Dieser Konverter überprüft die JSON -Struktur und gibt eine Liste oder eine NULL basierend auf dem Vorhandensein eines Arrays oder eines Objekts zurück.

public class FacebookMediaJsonConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartArray)
            return serializer.Deserialize>(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);
    }
}

Verwendung:

, um den Konverter zu verwenden, verwenden Sie [jsonConverter] Attribut -Kommentatorklasse:

[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List Media { get; set; }

Erweiterungen für einzelne Objekte:

Wenn Sie möchten, dass eine Liste empfangen wird, auch wenn nur ein Objekt, können Sie den Konverter erweitern, um ein einzelnes Objekt in eine Liste umzuwandeln.

public class SingleValuearrayConverter : JsonConverter { Public Override Object Readjson (JsonReader Reader, Type ObjectType, Object ExistentValue, JsonSerializer Serializer) { Objektergebnis; if (reader.tokentype == jsontoken.startObject) { T Instance = (t) serializer.deserialize (reader, typeof (t)); result = new List {Instance}; } sonst wenn (reader.tokentype == jsontoken.startArray) { result = serializer.deserialize (reader, ObjectType); } anders { Neue JsonSerializationException ("Unerwarteter Token -Typ" werfen. } Rückgabeergebnis; } // ... der Rest der Konverter -Implementierung ... }
public class SingleValueArrayConverter : 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 { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            result = serializer.Deserialize(reader, objectType);
        }
        else
        {
            throw new JsonSerializationException("Unexpected token type.");
        }
        return result;
    }

    // ... 转换器实现的其余部分 ...
}
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3