gpt4 book ai didi

c# - 我如何让 json.net 序列化从 List 派生的类的成员?

转载 作者:太空狗 更新时间:2023-10-29 17:44:44 25 4
gpt4 key购买 nike

我创建了一个类 PagedResult<T> : List<T>它包含一些添加的成员,以便与我们的组件之一一起工作。但是,当我运行 json 反序列化器时,它只序列化列表。如果我用 [JsonObject] 标记派生类和 [JsonProperty]那么它只会序列化派生类的成员而不是列表。如何同时获得两者?

最佳答案

默认情况下,Json.Net 将处理任何实现 IEnumerable 的类作为一个数组。您可以通过使用 [JsonObject] 装饰类来覆盖此行为。属性,但如您所见,只有对象属性会被序列化。列表本身不会被序列化,因为它不是通过公共(public)属性公开的(而是通过 GetEnumerator() 方法公开的)。

如果你两者都想要,你可以按照@Konrad 的建议,在你的派生类上提供一个公共(public)属性来公开列表,或者你可以写一个自定义的 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"
]
}

关于c# - 我如何让 json.net 序列化从 List<T> 派生的类的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21265629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com