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
Barbara Streisandoriginal
2025-02-02 08:41:08381parcourir

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:

<code class="language-csharp">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; }
}</code>
Maintenant, supposons que nous ayons un exemple d'employé et d'artiste.

<code class="language-json">[
  {
    "Department": "Department1",
    "JobTitle": "JobTitle1",
    "FirstName": "FirstName1",
    "LastName": "LastName1"
  },
  {
    "Department": "Department2",
    "JobTitle": "JobTitle2",
    "FirstName": "FirstName2",
    "LastName": "LastName2"
  },
  {
    "Skill": "Painter",
    "FirstName": "FirstName3",
    "LastName": "LastName3"
  }
]</code>
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

:
<code class="language-csharp">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;
    }
}</code>

JsonCreationConverter<Person> En utilisant ce convertisseur personnalisé, nous pouvons approfondir la chaîne JSON: PersonConverter

<code class="language-csharp">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;
    }
}</code>
analysera le contenu JSON pour déterminer le type correct de chaque personne et créera une instance de

,

ou
<code class="language-csharp">string json = "[...]"; //  此处应替换为实际的JSON字符串
List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json, new PersonConverter());</code>
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:
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