ホームページ > バックエンド開発 > C++ > .NET Core で型判別を使用して、入れ子になった JSON を入れ子になった辞書に逆シリアル化する方法

.NET Core で型判別を使用して、入れ子になった JSON を入れ子になった辞書に逆シリアル化する方法

DDD
リリース: 2024-12-29 08:04:13
オリジナル
892 人が閲覧しました

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

ネストされた JSON のネストされた辞書への逆シリアル化型判別あり

.NET Core 3.1 では、System.Text.Json が JSON を逆シリアル化する標準的な方法を提供します。デフォルトでは、JSON オブジェクトは JsonElement オブジェクトに逆シリアル化され、JSON データ構造へのアクセスを提供しますが、値を対応する C# 型に自動的に変換しません。

問題:

目標は、ネストされた JSON オブジェクトを Dictionary に逆シリアル化することですが、JSON プロパティには次の型識別が必要です値:

  • 文字列としての文字列
  • int/double としての数値
  • 辞書としてのオブジェクト

解決策:

を達成するにはSystem.Text.Json はこの特定の型変換にすぐに使える機能を提供していないため、ObjectAsPrimitiveConverter というカスタム JsonConverter が必要です。

ObjectAsPrimitiveConverter は次の機能を提供します。

  • タイプ認識逆シリアル化:

    • 文字列を文字列として変換します
    • ユーザー構成可能な形式に基づいて数値を int/double として変換します
    • オブジェクトを Dictionary
  • 数値処理:

    • 浮動小数点数の倍精度または 10 進精度をサポートします
    • サポートされていない数値を JsonElements として処理するかスローするオプションが含まれています例外
  • オブジェクト処理:

    • ユーザーが Dictionary のどちらを使用するかを選択できるようにします。またはオブジェクトの ExpandoObject

実装:

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,
}
ログイン後にコピー

使用法:

JSON を動的オブジェクト (または ExpandoObject の場合) に逆シリアル化するには

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);
ログイン後にコピー

注:

  • JSON では、任意の精度と大きさの数値が許可されます。 .NET プリミティブ数値型はそうではありません。 JSON 数値を .NET プリミティブ型に解析できない場合、コンバーターは、数値の JsonElement を返すか、例外をスローするオプションを提供します。
  • コンバーターは、倍精度または 10 進精度を使用するように構成できます。浮動小数点数と Dictionary の場合JSON オブジェクトの場合は ExpandoObject です。

以上が.NET Core で型判別を使用して、入れ子になった JSON を入れ子になった辞書に逆シリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート