Heim >Backend-Entwicklung >C++ >Wie deserialisiere ich JSON mit optionalen Arrays und Objekten in JSON.NET?

Wie deserialisiere ich JSON mit optionalen Arrays und Objekten in JSON.NET?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-12 19:07:44281Durchsuche

How to Deserialize JSON with Optional Arrays and Objects in JSON.NET?

Handhabung der Deserialisierung optionaler Arrays und Objekte in JSON.NET

Wenn Sie die JSON.NET-Bibliothek zur Verarbeitung der von Facebook zurückgegebenen Daten verwenden, kann es zu Änderungen in der JSON-Struktur kommen. Einige Eigenschaften werden manchmal als Arrays und manchmal als Objekte dargestellt. Dies kann zu Deserialisierungsproblemen führen.

Frage

Einige Facebook-Beiträge geben möglicherweise JSON im folgenden Format zurück, was dazu führt, dass die Deserialisierung fehlschlägt:

<code class="language-json">"attachment": {
    "media":{},
    "name":"",
    "caption":"",
    "description":"",
    "properties":{},
    "icon":"http://www.facebook.com/images/icons/mobile_app.gif",
    "fb_object_type":""
},
"permalink":"http://www.facebook.com/1234"</code>

Lösung

Um dieses Problem zu lösen, können Sie die Klasse JsonConverter verwenden, um einen benutzerdefinierten JSON-Konverter zu implementieren. Dieser Konverter verarbeitet Arrays und Objektstrukturen bestimmter Eigenschaften.

Benutzerdefinierter JSON-Konverter

Der folgende benutzerdefinierte Konverter SingleValueArrayConverter konvertiert ein einzelnes Objekt in eine Liste und ermöglicht so die korrekte Deserialisierung von Eigenschaften:

<code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        object retVal;
        if (reader.TokenType == JsonToken.StartObject)
        {
            T instance = (T)serializer.Deserialize(reader, typeof(T));
            retVal = new List<T>() { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            retVal = serializer.Deserialize(reader, objectType);
        }
        else
        {
            retVal = null; // 处理其他情况,例如空值
        }
        return retVal;
    }

    public override bool CanConvert(Type objectType)
    {
        return true;
    }
}</code>

Nutzung

Um einen benutzerdefinierten Konverter zu verwenden, kommentieren Sie die Eigenschaft in der Zielklasse mit dem Attribut JsonConverter:

<code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))]
public List<OrderItem> Items { get; set; }</code>

Dadurch kann JSON.NET Arrays und Objektstrukturen von Items-Eigenschaften verarbeiten und so Deserialisierungsprobleme lösen. Beachten Sie das Hinzufügen von get; set; und die Handhabung von else-Fällen, um es robuster zu machen.

Das obige ist der detaillierte Inhalt vonWie deserialisiere ich JSON mit optionalen Arrays und Objekten in JSON.NET?. 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