Maison > développement back-end > C++ > Comment désérialiser JSON imbriqué dans un dictionnaire imbriqué avec discrimination de type dans .NET Core ?

Comment désérialiser JSON imbriqué dans un dictionnaire imbriqué avec discrimination de type dans .NET Core ?

DDD
Libérer: 2024-12-29 08:04:13
original
892 Les gens l'ont consulté

How to Deserialize Nested JSON into a Nested Dictionary with Type Discrimination in .NET Core?

Désérialisation du JSON imbriqué dans un dictionnaire imbriqué avec discrimination de type

Dans .NET Core 3.1, System.Text.Json fournit un moyen standard de désérialiser JSON. Par défaut, les objets JSON sont désérialisés en objets JsonElement, qui donnent accès à la structure de données JSON mais ne convertissent pas automatiquement les valeurs en leurs types C# correspondants.

Problème :

L'objectif est de désérialiser les objets JSON imbriqués dans Dictionary, mais avec la discrimination de type suivante pour la propriété JSON valeurs :

  • Chaînes sous forme de chaînes
  • Nombres sous forme d'int/double
  • Objets sous forme de dictionnaire

Solution :

Pour y parvenir, un JsonConverter appelé ObjectAsPrimitiveConverter est nécessaire, car System.Text.Json ne fournit pas de fonctionnalités prêtes à l'emploi pour cette conversion de type spécifique.

ObjectAsPrimitiveConverter offre les fonctionnalités suivantes :

  • Conscience de la saisie désérialisation :

    • Convertit les chaînes en chaînes
    • Convertit les nombres en int/double en fonction d'un format configurable par l'utilisateur
    • Convertit les objets en dictionnaire
  • Gestion des nombres :

    • Prend en charge la précision double ou décimale pour les nombres à virgule flottante
    • Inclut une option pour gérer les nombres non pris en charge en tant que JsonElements ou lancer exceptions
  • Gestion des objets :

    • Permet à l'utilisateur de choisir entre l'utilisation du dictionnaire ou ExpandoObject pour les objets

Mise en œuvre :

public class ObjectAsPrimitiveConverter : JsonConverter<object>
{
    // Configuration options
    FloatFormat FloatFormat { get; init; }
    UnknownNumberFormat UnknownNumberFormat { get; init; }
    ObjectFormat ObjectFormat { get; init; }

    public ObjectAsPrimitiveConverter()
        : this(FloatFormat.Double, UnknownNumberFormat.Error, ObjectFormat.Expando)
    {
    }

    public ObjectAsPrimitiveConverter(
        FloatFormat floatFormat,
        UnknownNumberFormat unknownNumberFormat,
        ObjectFormat objectFormat)
    {
        this.FloatFormat = floatFormat;
        this.UnknownNumberFormat = unknownNumberFormat;
        this.ObjectFormat = objectFormat;
    }

    // ... implementation details ...
}

public enum FloatFormat
{
    Double,
    Decimal,
}

public enum UnknownNumberFormat
{
    Error,
    JsonElement,
}

public enum ObjectFormat
{
    Expando,
    Dictionary,
}
Copier après la connexion

Utilisation :

Pour désérialiser JSON en un objet dynamique (ou ExpandoObject si configuré) à l'aide de l'outil ObjectAsPrimitiveConverter, spécifiez le convertisseur dans JsonSerializerOptions comme ceci :

var options = new JsonSerializerOptions
{
    Converters = { new ObjectAsPrimitiveConverter(floatFormat : FloatFormat.Double, unknownNumberFormat : UnknownNumberFormat.Error, objectFormat : ObjectFormat.Expando) },
    WriteIndented = true,
};
dynamic d = JsonSerializer.Deserialize<dynamic>(json, options);
Copier après la connexion

Remarques :

  • JSON autorise des nombres de précision et d'ampleur arbitraires, tandis que .NET Les types numériques primitifs ne le font pas. Dans les cas où un numéro JSON ne peut pas être analysé en un type primitif .NET, le convertisseur offre la possibilité de renvoyer un JsonElement pour le numéro ou de lever une exception.
  • Le convertisseur peut être configuré pour utiliser une précision double ou décimale. pour les nombres à virgule flottante et Dictionary ou ExpandoObject pour les objets JSON.

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!

source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal