この記事では、混合データ型を含む JSON 配列を厳密に型指定された C# クラスに逆シリアル化する方法を説明します。 問題は、辞書の値が名前のない要素の配列である JSON の一貫性のないスキーマにあります。
JSON の例は次のようになります:
<code class="language-json">{ "timestamp": 1473730993, "total_players": 945, "max_score": 8961474, "players": { "Player1Username": [ 121, "somestring", 679900, 5, 4497, "anotherString", "thirdString", "fourthString", 123, 22, "YetAnotherString"], "Player2Username": [ 886, "stillAstring", 1677, 1, 9876, "alwaysAstring", "thirdString", "fourthString", 876, 77, "string"] } }</code>
このソリューションでは、Newtonsoft.Json とカスタム コンバーター ObjectToArrayConverter<T>
を使用して、名前のない配列要素を Player
クラスのプロパティにマップします。 JsonProperty
パラメータを伴う Order
属性は、配列要素をその位置に基づいてクラス プロパティに正しくマッピングするために重要です。
ここでは主要なクラスを簡略化して表現します:
プレイヤークラス:
<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>
ObjectToArrayConverter<T>
クラス (簡潔にするために実装は省略) は変換ロジックを処理します。 ルート オブジェクト ScoreboardResults
は、JSON 構造全体を保持するように定義されています:
ScoreboardResults クラス:
<code class="language-csharp">public class ScoreboardResults { public int timestamp { get; set; } public int total_players { get; set; } public int max_score { get; set; } public Dictionary<string, Player> players { get; set; } }</code>
または、DataContract
属性と DataMember
属性でも、プロパティの順序を指定することで同様の結果を得ることができます。 この記事では、完全なコード例については、デモ フィドル (リンクはここには含まれていません) を参照することを提案しています。 このアプローチは、複雑で一貫性のない構造の JSON データを、厳密に型指定された C# オブジェクトに逆シリアル化する処理を効果的に処理します。
以上が混合データの JSON 配列を厳密に型指定された C# クラスに逆シリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。