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