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

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

Barbara Streisand
リリース: 2025-02-02 08:41:08
オリジナル
433 人が閲覧しました

カスタムJSON.NETコンバーターバックを使用 - シーケンス化ポリ型JSONデータ

カスタムJSON.NETコンバーターは、シリアル化とバックシーケーション化プロセスをカスタマイズする強力なメカニズムを提供します。開発者はjson.netの関数を拡張して、より複雑なデータ型またはシナリオを処理することができます。

多型に対処するときにそのようなシーンが現れるとき、異なるタイプの継承の継承。次の例を考えてみましょう:

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; }
}
ログイン後にコピー
さて、従業員とアーティストの例があるとします。

[
  {
    "Department": "Department1",
    "JobTitle": "JobTitle1",
    "FirstName": "FirstName1",
    "LastName": "LastName1"
  },
  {
    "Department": "Department2",
    "JobTitle": "JobTitle2",
    "FirstName": "FirstName2",
    "LastName": "LastName2"
  },
  {
    "Skill": "Painter",
    "FirstName": "FirstName3",
    "LastName": "LastName3"
  }
]
ログイン後にコピー
このjsonを

にシーケンスし、すべての人の特定のタイプを正しく識別するにはどうすればよいですか? List<Person>

<定>カスタムコンバーターソリューション

Standard<没有>は、正しいタイプを決定するJSONコンテンツに基づくメソッドを提供しません。ただし、メソッドを書き換えて、新しい抽象

メソッド(この方法は

)を導入して、独自のカスタムコンバーターを作成できます。 CustomCreationConverter ReadJson特定のシーンでは、拡張を作成しましたCreateJObject

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

このカスタムコンバーターを使用して、JSON文字列を深めることができます。 JsonCreationConverter<Person> PersonConverter<分>JSONコンテンツを分析して、各人の正しいタイプを決定し、

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;
    }
}
ログイン後にコピー
、または

のインスタンスを作成します。これにより、多型データ構造をシームレスに深めることができます。

string json = "[...]"; //  此处应替换为实际的JSON字符串
List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json, new PersonConverter());
ログイン後にコピー

以上がカスタムJSON.NETコンバーターを使用して多型JSONデータを脱着する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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