ホームページ >バックエンド開発 >C++ >カスタムJSON.NETコンバーターを使用して多型JSONデータを脱着する方法は?

カスタムJSON.NETコンバーターを使用して多型JSONデータを脱着する方法は?

Barbara Streisand
Barbara Streisandオリジナル
2025-02-02 08:41:08381ブラウズ

カスタム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特定のシーンでは、拡張を作成しましたCreateJObject

<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> PersonConverterJSONコンテンツを分析して、各人の正しいタイプを決定し、

<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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。