ホームページ > バックエンド開発 > C++ > Newtonsoft.Json を使用して動的数値キーを使用して JSON を逆シリアル化する方法

Newtonsoft.Json を使用して動的数値キーを使用して JSON を逆シリアル化する方法

DDD
リリース: 2025-01-13 19:07:44
オリジナル
695 人が閲覧しました

How to Deserialize JSON with Dynamic Numeric Keys Using Newtonsoft.Json?

動的 (数値) キー名を持つサブオブジェクトを逆シリアル化するにはどうすればよいですか?

動的なキー名を持つサブオブジェクトを含む複雑な JSON 構造を扱う場合、Newtonsoft JSON.NET を使用してそれらを逆シリアル化すると課題が生じる可能性があります。この記事では、そのような構造が関係するシナリオを詳しく掘り下げ、カスタム JSON コンバーターを使用した完全なソリューションを提供します。

JSON 構造

次の JSON 構造について考えてみましょう:

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

この構造では、「users」オブジェクトには、既知のプロパティ (「parentname」) と未知のプロパティ (子オブジェクトを表す数値キー) が混在しています。目標は、この構造を C# オブジェクト モデルに逆シリアル化し、サブオブジェクトが厳密に型指定されたクラスとして表現されるようにすることです。

最初の試みと課題

標準の JSON.NET コードを使用して JSON を逆シリアル化する最初の試みは次のようになります:

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

class User
{
    public string name { get; set; }
    public string state { get; set; }
    public string id { get; set; }
}</code>
ログイン後にコピー

「users」オブジェクトに不明なプロパティがあるため、このオブジェクト モデルへの逆シリアル化は失敗します。 JSON.NET はデフォルトでプロパティ名がクラス プロパティと一致することを期待しており、数値キーが User クラスのどのプロパティにも対応していないため、逆シリアル化プロセスは失敗します。

カスタム JSON コンバータ

この問題を解決するには、カスタム JSON コンバーターが必要です。 TypedExtensionDataConverterこの問題をエレガントに解決します。コードは次のとおりです:

<code class="language-csharp">public class TypedExtensionDataConverter<T> : JsonConverter
{
    // ... [此处省略实现,篇幅原因]
}</code>
ログイン後にコピー

このコンバーターを使用すると、未知のプロパティを 型付き コンテナー (この場合はユーザー オブジェクトのディクショナリ) に逆シリアル化できます:

<code class="language-csharp">[JsonConverter(typeof(TypedExtensionDataConverter<Users>))]
class Users
{
    public Users()
    {
        this.UserTable = new Dictionary<string, User>();
    }

    [JsonProperty("parentname")]
    public string ParentName { get; set; }

    [JsonTypedExtensionData]
    public Dictionary<string, User> UserTable { get; set; }
}</code>
ログイン後にコピー

JsonTypedExtensionDataAttribute を使用することで、コンバーターは未知のプロパティを UserTable ディクショナリにシリアル化/逆シリアル化することを認識します。

完全なソリューション

カスタム コンバーターを使用すると、完全なソリューションは次のようになります:

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

[JsonConverter(typeof(TypedExtensionDataConverter<Users>))]
class Users
{
    // ... [如上实现]
}

class User
{
    // ... [不变]
}</code>
ログイン後にコピー

逆シリアル化された JSON 構造は、RootObject オブジェクト内の Users ディクショナリに格納されているサブオブジェクトを含む、期待される値を UserTable に設定します。

以上がNewtonsoft.Json を使用して動的数値キーを使用して JSON を逆シリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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