Maison >développement back-end >C++ >Comment désérialiser JSON avec des objets enfants nommés dynamiquement en C# ?

Comment désérialiser JSON avec des objets enfants nommés dynamiquement en C# ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-13 18:52:45765parcourir

How to Deserialize JSON with Dynamically Named Child Objects in C#?

Désérialisation JSON de sous-objets nommés dynamiquement en C#

La gestion de la désérialisation des structures JSON avec des sous-objets nommés dynamiquement peut s'avérer difficile. Prenons l'exemple JSON suivant :

<code class="language-json">{
    "users": {
        "parentname": "test",
        "100034": {
            "name": "tom",
            "state": "WA",
            "id": "cedf-c56f-18a4-4b1"
        },
        "10045": {
            "name": "steve",
            "state": "NY",
            "id": "ebb2-92bf-3062-7774"
        },
        "12345": {
            "name": "mike",
            "state": "MA",
            "id": "fb60-b34f-6dc8-aaf7"
        }
    }
}</code>

Les tentatives de désérialisation à l'aide du code suivant peuvent échouer :

<code class="language-csharp">public class RootObject
{
    public string ParentName { get; set; }
    public Dictionary<string, User> users { get; set; }
}

public class User
{
    public string name { get; set; }
    public string state { get; set; }
    public string id { get; set; }
}</code>

Cela est dû au fait que RootObject les noms de propriétés connus dans la classe ne correspondent pas aux noms dynamiques des objets enfants dans le JSON.

La solution consiste à utiliser un convertisseur personnalisé pour gérer les noms de propriétés dynamiques et les désérialiser dans un dictionnaire d'objets fortement typés. Pour ce faire, il vous faut :

  1. Créez une classe de convertisseur qui hérite de JsonConverter et fournissez une logique de désérialisation et de sérialisation :

    <code class="language-csharp"> public class TypedExtensionDataConverter<T> : JsonConverter // ... 实现略 ...</code>
  2. Utilisez l'attribut [JsonTypedExtensionData] pour marquer l'attribut dans le modèle de données qui contiendra le dictionnaire des objets nommés dynamiquement :

    <code class="language-csharp"> [JsonConverter(typeof(TypedExtensionDataConverter<User>))]
     class Users
     {
         [JsonProperty("parentname")]
         public string ParentName { get; set; }
    
         [JsonTypedExtensionData]
         public Dictionary<string, User> UserTable { get; set; }
     }</code>
  3. Modèle de données mis à jour pour gérer correctement les sous-objets dynamiques :

    <code class="language-csharp"> public class RootObject
     {
         [JsonProperty("users")]
         public Users Users { get; set; }
     }</code>

En utilisant un convertisseur personnalisé, les structures JSON peuvent être désérialisées avec succès en un modèle objet C# fortement typé, préservant ainsi la structure hiérarchique et la nature dynamique des données d'origine.

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