の使用 特定のコンポーネントでの作業を容易にするために、List
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 サイトの他の関連記事を参照してください。