ホームページ >バックエンド開発 >C++ >json.netを使用してタイプ情報なしで多型JSONを脱色するにはどうすればよいですか?

json.netを使用してタイプ情報なしで多型JSONを脱色するにはどうすればよいですか?

DDD
DDDオリジナル
2025-02-02 11:56:10150ブラウズ

How to Deserialize Polymorphic JSON Without Type Information Using JSON.NET?

json.netバックを使用するために必要なタイプ情報は必要ありません。

JSON.NETは、強力な.NET JSONシリアル化および砂漠化ライブラリです。ただし、シリアル化されたデータに情報の種類がない場合、カウンターシーケンシャル多型JSONは困難な場合があります。 質問:タイプ情報の欠如

多型により、複数のクラスがパブリックベースクラスから継承できるようになります。深部化が多型オブジェクトのJSONデータを表す場合、情報の種類がない場合、どのクラスをインスタンス化する必要があるかを判断することは困難です。

たとえば、次のJSONデータを考慮すると、ギャラリーの画像またはギャラリーアルバムクラスが示されています。 "is_album"属性は区別されます。ギャラリー画像の「is_album」はfalseに設定されており、ギャラリーアルバムはTrueに設定されています。

解決策:jsonconveter

この多型JSONの依存性については、オブジェクトインスタンスを処理するためにカスタムJSonConverrerを作成できます。コンバーターは「is_album」プロパティをチェックし、対応するクラスインスタンスを作成します。

<code class="language-json">{
    "id": "OUHDm",
    "title": "My most recent drawing. Spent over 100 hours.",
    "is_album": false
}</code>
これは、GalleryItemConverter:

と呼ばれるサンプルコンバーターです

json.netのバックシリアル化の使用

コンバーターを使用するには、以下に示すように、デフォルトのjson.net backlier serializerにパラメーターとして含めてください。

の例出力の例

<code class="language-csharp">public class GalleryItemConverter : JsonConverter
{
    // 指定转换器可以转换GalleryItem及其派生类
    public override bool CanConvert(Type objectType) => typeof(GalleryItem).IsAssignableFrom(objectType);

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 将JSON读取为JObject
        JObject jo = JObject.Load(reader);

        // 检查"is_album"属性以确定类类型
        bool? isAlbum = (bool?)jo["is_album"];

        GalleryItem item;
        if (isAlbum.GetValueOrDefault())
            item = new GalleryAlbum();
        else
            item = new GalleryImage();

        // 从JSON数据填充项目属性
        serializer.Populate(jo.CreateReader(), item);

        return item;
    }
}</code>
提供されたJSONデータとカスタムコンバーターを使用して、捨てられたGalleryItemオブジェクトを取得できます。

以上がjson.netを使用してタイプ情報なしで多型JSONを脱色するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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