ホームページ > バックエンド開発 > C++ > Json.NETを使用して追加メンバーを含むリスト派生クラスをシリアル化する方法は?

Json.NETを使用して追加メンバーを含むリスト派生クラスをシリアル化する方法は?

DDD
リリース: 2025-01-07 13:07:41
オリジナル
387 人が閲覧しました

How to Serialize a List-Derived Class with Additional Members Using Json.NET?

リストから派生したクラスのメンバーをシリアル化する方法 Json.net

の使用 特定のコンポーネントでの作業を容易にするために、List から新しいクラス PagedResult を派生する必要があります。追加のメンバーも含めます。ただし、JSON デシリアライザーを実行すると、リストのみがシリアル化されます。派生クラスで [JsonObject] 属性と [JsonProperty] 属性を使用すると、リストを除く派生クラスのメンバーのみがシリアル化されます。この記事では、リストとその派生クラス メンバーの両方をシリアル化する方法について説明します。

Json.Net は、デフォルトで IEnumerable を実装するクラスを配列として扱います。 [JsonObject] 属性でクラスを修飾するとこの動作をオーバーライドできますが、オブジェクトのプロパティのみがシリアル化され、リストはシリアル化されません。これは、リストにパブリック プロパティではなく GetEnumerator() メソッド経由でアクセスできるためです。

両方を含めるには、@ で提案されているように、派生クラスのパブリック プロパティをリストにアクセスできるようにすることができます。 Konrad を使用するか、カスタム JsonConverter を作成してオブジェクト全体をシリアル化します。以下は例です。

PagesResult を想定しています。として存在します:

class PagedResult<T> : List<T>
{
    public int PageSize { get; set; }
    public int PageIndex { get; set; }
    public int TotalItems { get; set; }
    public int TotalPages { get; set; }
}
ログイン後にコピー

カスタム コンバーターを作成する方法は次のとおりです:

class PagedResultConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(PagedResult<T>));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        PagedResult<T> result = (PagedResult<T>)value;
        JObject jo = new JObject();
        jo.Add("PageSize", result.PageSize);
        jo.Add("PageIndex", result.PageIndex);
        jo.Add("TotalItems", result.TotalItems);
        jo.Add("TotalPages", result.TotalPages);
        jo.Add("Items", JArray.FromObject(result.ToArray(), serializer));
        jo.WriteTo(writer);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        PagedResult<T> result = new PagedResult<T>();
        result.PageSize = (int)jo["PageSize"];
        result.PageIndex = (int)jo["PageIndex"];
        result.TotalItems = (int)jo["TotalItems"];
        result.TotalPages = (int)jo["TotalPages"];
        result.AddRange(jo["Items"].ToObject<T[]>(serializer));
        return result;
    }
}
ログイン後にコピー

(このアプローチでは [JsonObject] と [JsonProperty] は必要ありません。何をシリアル化するかはコンバーター クラスでエンコードされます。)

以下は、コンバータ:

class Program
{
    static void Main(string[] args)
    {
        PagedResult<string> result = new PagedResult<string> { "foo", "bar", "baz" };
        result.PageIndex = 0;
        result.PageSize = 10;
        result.TotalItems = 3;
        result.TotalPages = 1;

        JsonSerializerSettings settings = new JsonSerializerSettings();
        settings.Converters.Add(new PagedResultConverter<string>());
        settings.Formatting = Formatting.Indented;

        string json = JsonConvert.SerializeObject(result, settings);
        Console.WriteLine(json);
    }
}
ログイン後にコピー

出力:

{
  "PageSize": 10,
  "PageIndex": 0,
  "TotalItems": 3,
  "TotalPages": 1,
  "Items": [
    "foo",
    "bar",
    "baz"
  ]
}
ログイン後にコピー

以上がJson.NETを使用して追加メンバーを含むリスト派生クラスをシリアル化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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