Sin*_*tic 10 c# serialization json.net
我创建了一个PagedResult<T> : List<T>包含一些添加成员的类,以便使用我们的一个组件.但是,当我运行json反序列化器时,它只序列化列表.如果我的标记与派生类[JsonObject]和[JsonProperty]然后它只会序列化派生类的成员,而不是名单.我如何得到两者?
Bri*_*ers 10
默认情况下,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; }
}
Run Code Online (Sandbox Code Playgroud)
你可以像这样制作一个转换器:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
(另请注意,此方法不需要[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);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
{
"PageSize": 10,
"PageIndex": 0,
"TotalItems": 3,
"TotalPages": 1,
"Items": [
"foo",
"bar",
"baz"
]
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1324 次 |
| 最近记录: |