Maison >développement back-end >C++ >Comment désérialiser un tableau JSON de valeurs de type mixte dans une classe C# fortement typée ?

Comment désérialiser un tableau JSON de valeurs de type mixte dans une classe C# fortement typée ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-24 04:11:08385parcourir

How to Deserialize a JSON Array of Mixed-Type Values into a Strongly-Typed C# Class?

Désérialisation de tableaux JSON avec des types de données mixtes en classes C#

Ce guide aborde les complexités de la désérialisation des données JSON où la structure présente des défis pour le mappage direct vers des classes C# fortement typées. Plus précisément, nous aborderons des scénarios impliquant des tableaux de types de données mixtes au sein d'une structure apparemment semblable à un dictionnaire.

Le problème :

Les structures JSON courantes peuvent présenter des données où :

  • Tableaux sans nom : Les tableaux de valeurs manquent de noms de propriétés explicites, ce qui rend la désérialisation directe difficile.
  • Types de données mixtes : Les tableaux contiennent des éléments de différents types (par exemple, des entiers, des chaînes).
  • Structure de type dictionnaire : La structure globale ressemble à un dictionnaire, mais les valeurs sont ces tableaux problématiques.

Solutions :

Plusieurs techniques permettent de surmonter ces obstacles :

1. Tirer parti de ObjectToArrayConverter :

Le ObjectToArrayConverter de Json.NET fournit un mécanisme puissant pour mapper un tableau de valeurs aux propriétés d'un objet C#. Cela nécessite un examen attentif de l'ordre de propriété.

<code class="language-csharp">[JsonConverter(typeof(ObjectToArrayConverter<Player>))]
public class Player
{
    [JsonProperty(Order = 1)]
    public int UniqueID { get; set; }
    [JsonProperty(Order = 2)]
    public string PlayerDescription { get; set; }
    // ... other properties
}</code>

La propriété JsonProperty de l'attribut Order est cruciale ; il garantit le mappage correct des éléments du tableau aux propriétés en fonction de leur séquence.

2. Restructuration de l'objet racine :

Une approche plus simple pourrait impliquer de restructurer l'objet racine pour représenter directement la nature des données, semblable à un dictionnaire.

<code class="language-csharp">public class ScoreboardResults
{
    // ... other properties
    public Dictionary<string, Player> Players { get; set; }
}</code>

Cela simplifie considérablement la désérialisation, car les clés et valeurs du dictionnaire correspondent directement à la structure JSON.

3. Convertisseur personnalisé (avancé) :

Pour les scénarios complexes, un JsonConverter personnalisé offre le plus de contrôle. Cela permet une logique d'analyse complexe adaptée à la structure JSON spécifique.

Exemple (en utilisant ObjectToArrayConverter) :

<code class="language-csharp">// Sample JSON (replace with your actual JSON)
string jsonString = "...";

// Deserialize using ObjectToArrayConverter
var results = JsonConvert.DeserializeObject<ScoreboardResults>(jsonString);

// Access player data
foreach (var kvp in results.Players)
{
    Console.WriteLine($"{kvp.Key}: {kvp.Value.UniqueID} - {kvp.Value.PlayerDescription}");
}</code>

N'oubliez pas d'installer le package Newtonsoft.Json NuGet pour la fonctionnalité Json.NET. Choisissez la solution la mieux adaptée à votre structure et à votre complexité JSON. La restructuration de l'objet racine constitue souvent la solution la plus simple et la plus maintenable. ObjectToArrayConverter est un outil puissant pour les scénarios plus complexes nécessitant un contrôle précis de l'ordre des propriétés. Un convertisseur personnalisé ne doit être envisagé que lorsque les autres méthodes sont insuffisantes.

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