Heim > Backend-Entwicklung > C++ > Wie kann man polymorphe JSON -Daten mit einem benutzerdefinierten JSON.NET -Konverter deserialisieren?

Wie kann man polymorphe JSON -Daten mit einem benutzerdefinierten JSON.NET -Konverter deserialisieren?

Barbara Streisand
Freigeben: 2025-02-02 08:41:08
Original
433 Leute haben es durchsucht

Verwenden eines benutzerdefinierten JSON.NET -Konverters Back -sequentialisierte polymorphe JSON -Daten

benutzerdefinierte json.net Converter bietet einen leistungsstarken Mechanismus zum Anpassen der Serialisierung und des Rücks -Sequentialisierungsprozesses. Es ermöglicht Entwicklern, die Funktion von JSON.NET zu erweitern, um kompliziertere Datentypen oder Szenarien zu verarbeiten.

Wenn eine solche Szene beim Umgang mit Polymorphismus erscheint, sind verschiedene Arten der Vererbung der Vererbung. Betrachten Sie das folgende Beispiel:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Employee : Person
{
    public string Department { get; set; }
    public string JobTitle { get; set; }
}

public class Artist : Person
{
    public string Skill { get; set; }
}
Nach dem Login kopieren
Angenommen, wir haben ein Beispiel für Mitarbeiter und Künstler.

[
  {
    "Department": "Department1",
    "JobTitle": "JobTitle1",
    "FirstName": "FirstName1",
    "LastName": "LastName1"
  },
  {
    "Department": "Department2",
    "JobTitle": "JobTitle2",
    "FirstName": "FirstName2",
    "LastName": "LastName2"
  },
  {
    "Skill": "Painter",
    "FirstName": "FirstName3",
    "LastName": "LastName3"
  }
]
Nach dem Login kopieren
Wie sequenzieren wir diesen JSON in

und identifizieren die spezifische Art von allen richtig? List<Person>

<定> Benutzerdefinierte Konverterlösung

Standard <没有> bietet keine Methode basierend auf JSON -Inhalten, um den richtigen Typ zu bestimmen. Wir können jedoch die <方法> -Methode umschreiben und eine neue Zusammenfassung

einführen (diese Methode akzeptiert ein

), um unseren eigenen benutzerdefinierten Konverter zu erstellen: CustomCreationConverter ReadJson Create In unserer spezifischen Szene haben wir eine Erweiterung JObject

:
public abstract class JsonCreationConverter<T> : JsonConverter
{
    protected abstract T Create(Type objectType, JObject jObject);

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jObject = JObject.Load(reader);
        T target = Create(objectType, jObject);
        serializer.Populate(jObject.CreateReader(), target);
        return target;
    }
}
Nach dem Login kopieren
erstellt

JsonCreationConverter<Person> Mit diesem benutzerdefinierten Konverter können wir die JSON -Zeichenfolge vertiefen: PersonConverter

public class PersonConverter : JsonCreationConverter<Person>
{
    protected override Person Create(Type objectType, JObject jObject)
    {
        if (FieldExists("Skill", jObject))
        {
            return new Artist();
        }
        else if (FieldExists("Department", jObject))
        {
            return new Employee();
        }
        else
        {
            return new Person();
        }
    }

    private bool FieldExists(string fieldName, JObject jObject)
    {
        return jObject[fieldName] != null;
    }
}
Nach dem Login kopieren
<分> analysiert den JSON -Inhalt, um den richtigen Typ jeder Person zu bestimmen und eine Instanz von

,

oder
string json = "[...]"; //  此处应替换为实际的JSON字符串
List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json, new PersonConverter());
Nach dem Login kopieren
entsprechend zu erstellen. Dies ermöglicht nahtlos die polymorphe Datenstruktur.

PersonConverter Employee

Das obige ist der detaillierte Inhalt vonWie kann man polymorphe JSON -Daten mit einem benutzerdefinierten JSON.NET -Konverter deserialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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