Heim >Backend-Entwicklung >C++ >Wie kann man polymorphe JSON ohne Typinformationen mit json.net deserialisieren?

Wie kann man polymorphe JSON ohne Typinformationen mit json.net deserialisieren?

DDD
DDDOriginal
2025-02-02 11:56:10148Durchsuche

How to Deserialize Polymorphic JSON Without Type Information Using JSON.NET?

müssen keine Typinformationen benötigen, um json.net zurück zu verwenden.

json.net ist eine leistungsstarke JSON -Serialisierung und Desertilisations -Bibliothek. Wenn jedoch keine Informationen in den serialisierten Daten vorhanden sind, kann der Gegenpolymorphismus JSON eine Herausforderung sein. <:> Frage: Mangel an Typinformationen

Polymorphismus ermöglicht es mehreren Klassen, von einer öffentlichen Basisklasse zu erben. Wenn die tiefere Tiefe die JSON -Daten des polymorphen Objekts darstellt, ist es schwierig zu bestimmen, welche Klasse instanziiert werden soll, wenn keine Art von Informationen vorhanden ist.

In Anbetracht der folgenden JSON -Daten wird beispielsweise angegeben, dass Galerie -Bild- oder Galerie -Albumklasse:

"is_album" -attribute werden unterschieden. Das "Is_Album" von Galerie -Images ist auf False eingestellt, und Galeriealben ist auf wahr.

Lösung: JsonConveter

<code class="language-json">{
    "id": "OUHDm",
    "title": "My most recent drawing. Spent over 100 hours.",
    "is_album": false
}</code>

Für die Abhängigkeit dieses polymorphen JSON können Sie einen benutzerdefinierten JsonConverrer erstellen, um die Objektinstanz zu verarbeiten. Der Konverter überprüft die Eigenschaft "is_album" und erstellt die entsprechende Klasseninstanz.

Dies ist ein Beispielkonverter namens GalerieItemConverter:

Die Verwendung der hinteren Serialisierung von json.net

Um den Konverter zu verwenden, geben Sie ihn bitte als Parameter in den Standard -Serializer JSON.net ein, wie unten gezeigt:

<code class="language-csharp">public class GalleryItemConverter : JsonConverter
{
    // 指定转换器可以转换GalleryItem及其派生类
    public override bool CanConvert(Type objectType) => typeof(GalleryItem).IsAssignableFrom(objectType);

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 将JSON读取为JObject
        JObject jo = JObject.Load(reader);

        // 检查"is_album"属性以确定类类型
        bool? isAlbum = (bool?)jo["is_album"];

        GalleryItem item;
        if (isAlbum.GetValueOrDefault())
            item = new GalleryAlbum();
        else
            item = new GalleryImage();

        // 从JSON数据填充项目属性
        serializer.Populate(jo.CreateReader(), item);

        return item;
    }
}</code>

Beispielausgabe

Verwenden der JSON -Daten und des benutzerdefinierten Konverters können Sie das Dealsed GalleryItem -Objekt erhalten:

Das obige ist der detaillierte Inhalt vonWie kann man polymorphe JSON ohne Typinformationen mit json.net deserialisieren?. 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