データ型が混在する JSON 配列を C# クラスに逆シリアル化する
このガイドでは、構造が厳密に型指定された C# クラスへの直接マッピングの課題を提示する JSON データの逆シリアル化の複雑さに対処します。 具体的には、一見辞書のような構造内に混合データ型の配列が含まれるシナリオに取り組みます。
問題:
一般的な JSON 構造では、次のようなデータが表示されます。
解決策:
いくつかのテクニックでこれらの障害を克服できます:
1. ObjectToArrayConverter
の活用:
Json.NET の ObjectToArrayConverter
は、値の配列を C# オブジェクトのプロパティにマップする強力なメカニズムを提供します。 これには、プロパティの順序を慎重に考慮する必要があります。
<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>
JsonProperty
属性の Order
プロパティは重要です。これにより、シーケンスに基づいて配列要素がプロパティに正しくマッピングされることが保証されます。
2.ルートオブジェクトの再構築:
より単純なアプローチには、データの辞書のような性質を直接表すためにルート オブジェクトを再構築することが含まれる場合があります。
<code class="language-csharp">public class ScoreboardResults { // ... other properties public Dictionary<string, Player> Players { get; set; } }</code>
辞書のキーと値が JSON 構造に直接対応するため、逆シリアル化が大幅に簡素化されます。
3.カスタムコンバーター (上級):
複雑なシナリオの場合、カスタム JsonConverter が最大限の制御を提供します。 これにより、特定の JSON 構造に合わせた複雑な解析ロジックが可能になります。
例 (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>
Json.NET 機能用の Newtonsoft.Json NuGet パッケージを忘れずにインストールしてください。 JSON の構造と複雑さに最も適したソリューションを選択してください。 多くの場合、ルート オブジェクトを再構築すると、最も単純で保守しやすい解決策が得られます。 ObjectToArrayConverter
は、正確なプロパティ順序制御が必要な、より複雑なシナリオに最適な強力なツールです。 カスタム コンバーターは、他の方法では不十分な場合にのみ検討してください。
以上が混合型値の JSON 配列を厳密に型指定された C# クラスに逆シリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。