Maison > développement back-end > C++ > Comment désérialiser les données JSON polymorphes à l'aide d'un convertisseur JSON.net personnalisé?

Comment désérialiser les données JSON polymorphes à l'aide d'un convertisseur JSON.net personnalisé?

Barbara Streisand
Libérer: 2025-02-02 08:41:08
original
455 Les gens l'ont consulté

en utilisant un convertisseur JSON.net personnalisé - Données JSON polymorphes suivis

Le convertisseur JSON.NET personnalisé fournit un mécanisme puissant pour personnaliser le processus de sérialisation et de dossier de dos. Il permet aux développeurs d'élargir la fonction de JSON.net pour traiter des types ou des scénarios de données plus compliqués.

Lorsqu'une telle scène apparaît lorsqu'elle traite du polymorphisme, différents types d'hérédité de l'héritage. Considérez l'exemple suivant:

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; }
}
Copier après la connexion
Maintenant, supposons que nous ayons un exemple d'employé et d'artiste.

[
  {
    "Department": "Department1",
    "JobTitle": "JobTitle1",
    "FirstName": "FirstName1",
    "LastName": "LastName1"
  },
  {
    "Department": "Department2",
    "JobTitle": "JobTitle2",
    "FirstName": "FirstName2",
    "LastName": "LastName2"
  },
  {
    "Skill": "Painter",
    "FirstName": "FirstName3",
    "LastName": "LastName3"
  }
]
Copier après la connexion
Comment séquences ce JSON à

et identifier correctement le type spécifique de tout le monde? List<Person>

<定> Solution de convertisseur personnalisé

Standard <没有> ne fournit pas de méthode basée sur le contenu JSON pour déterminer le type correct. Cependant, nous pouvons réécrire la méthode <方法> et introduire une nouvelle méthode abstraite

(cette méthode accepte un

) pour créer notre propre convertisseur personnalisé: CustomCreationConverter ReadJson Create Dans notre scène spécifique, nous avons créé une expansion 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;
    }
}
Copier après la connexion

JsonCreationConverter<Person> En utilisant ce convertisseur personnalisé, nous pouvons approfondir la chaîne JSON: 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;
    }
}
Copier après la connexion
<分> analysera le contenu JSON pour déterminer le type correct de chaque personne et créera une instance de

,

ou
string json = "[...]"; //  此处应替换为实际的JSON字符串
List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json, new PersonConverter());
Copier après la connexion
en conséquence. Cela permet d'approfondir de manière transparente la structure des données polymorphes.

PersonConverter Employee

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal