如何获取json.net来序列化从List派生的类的成员?

如何获取json.net来序列化从List派生的类的成员?,第1张

如何获取json.net来序列化从List派生的类的成员?

默认情况下,Json.Net将把任何实现

IEnumerable
为数组的类视为。您可以通过用
[JsonObject]
属性装饰类来覆盖此行为,但是如您所见,只有对象属性会被序列化。该列表本身不会被序列化,因为它不是通过公共属性公开的(而是通过
GetEnumerator()
方法公开的)。

如果两者都想要,则可以按照@Konrad的建议进行 *** 作,并在派​​生类上提供一个公共属性以显示列表,或者可以编写自定义

JsonConverter
序列化整个对象。后一种方法的示例如下。

假设您的

PagedResult<T>
课程如下所示:

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"  ]}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5427602.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存