カスタムJSON.NETコンバーターバックを使用 - シーケンス化ポリ型JSONデータ
カスタムJSON.NETコンバーターは、シリアル化とバックシーケーション化プロセスをカスタマイズする強力なメカニズムを提供します。開発者はjson.netの関数を拡張して、より複雑なデータ型またはシナリオを処理することができます。
多型に対処するときにそのようなシーンが現れるとき、異なるタイプの継承の継承。次の例を考えてみましょう:
<code class="language-csharp">public class Person { public string FirstName { get; set; } public string LastName { get; set; } } public class Employee : Person { public string Department { get; set; } public string JobTitle { get; set; } } public class Artist : Person { public string Skill { get; set; } }</code>さて、従業員とアーティストの例があるとします。
<code class="language-json">[ { "Department": "Department1", "JobTitle": "JobTitle1", "FirstName": "FirstName1", "LastName": "LastName1" }, { "Department": "Department2", "JobTitle": "JobTitle2", "FirstName": "FirstName2", "LastName": "LastName2" }, { "Skill": "Painter", "FirstName": "FirstName3", "LastName": "LastName3" } ]</code>このjsonを
にシーケンスし、すべての人の特定のタイプを正しく識別するにはどうすればよいですか? List<Person>
Standardは、正しいタイプを決定するJSONコンテンツに基づくメソッドを提供しません。ただし、
)を導入して、独自のカスタムコンバーターを作成できます。
CustomCreationConverter
ReadJson
特定のシーンでは、拡張を作成しましたCreate
JObject
:
<code class="language-csharp">public abstract class JsonCreationConverter<T> : JsonConverter { protected abstract T Create(Type objectType, JObject jObject); public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jObject = JObject.Load(reader); T target = Create(objectType, jObject); serializer.Populate(jObject.CreateReader(), target); return target; } }</code>
このカスタムコンバーターを使用して、JSON文字列を深めることができます。
JsonCreationConverter<Person>
PersonConverter
JSONコンテンツを分析して、各人の正しいタイプを決定し、
<code class="language-csharp">public class PersonConverter : JsonCreationConverter<Person> { protected override Person Create(Type objectType, JObject jObject) { if (FieldExists("Skill", jObject)) { return new Artist(); } else if (FieldExists("Department", jObject)) { return new Employee(); } else { return new Person(); } } private bool FieldExists(string fieldName, JObject jObject) { return jObject[fieldName] != null; } }</code>、または
のインスタンスを作成します。これにより、多型データ構造をシームレスに深めることができます。
<code class="language-csharp">string json = "[...]"; // 此处应替换为实际的JSON字符串 List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json, new PersonConverter());</code>
以上がカスタムJSON.NETコンバーターを使用して多型JSONデータを脱着する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。