.NET 6中如何用Newtonsoft.Json完整序列化PageResult<T>对象?
解决Newtonsoft.Json序列化PageResult仅显示Items的问题
问题根源在于PageResult<T>通常实现了IEnumerable<T>接口,Newtonsoft.Json默认会将实现该接口的对象序列化为数组,而非完整的对象结构,因此只输出了Items集合的内容。
以下是几种可行的解决方案:
方案1:给PageResult类添加[JsonObject]特性
如果有权限修改PageResult<T>的源码,直接在类上标记[JsonObject]特性,强制Json.NET按对象而非数组序列化:
[JsonObject] public class PageResult<T> : IEnumerable<T> { public IEnumerable<T> Items { get; } public string NextPageLink { get; } public int Count { get; } public PageResult(IEnumerable<T> items, string nextPageLink, int count) { Items = items; NextPageLink = nextPageLink; Count = count; } // 此处省略IEnumerable<T>接口的实现代码 }
修改后再执行原序列化代码,即可得到包含所有属性的JSON结构。
方案2:自定义ContractResolver(无需修改PageResult源码)
如果无法修改PageResult<T>的代码,可以通过自定义契约解析器,强制将PageResult<T>类型按对象处理:
List<string> listString = new List<string> { "Test1", "Test2" }; var pageResultTest = new PageResult<string>(listString, null, 2); var settings = new JsonSerializerSettings { Formatting = Formatting.Indented, ContractResolver = new DefaultContractResolver { CreateContract = type => { if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(PageResult<>)) { return CreateObjectContract(type); } return base.CreateContract(type); } } }; string serialized = JsonConvert.SerializeObject(pageResultTest, settings);
方案3:用匿名对象包装属性
最简单的临时解决方案是创建一个包含目标属性的匿名对象,序列化这个匿名对象:
List<string> listString = new List<string> { "Test1", "Test2" }; var pageResultTest = new PageResult<string>(listString, null, 2); var resultWrapper = new { Items = pageResultTest.Items, NextPageLink = pageResultTest.NextPageLink, Count = pageResultTest.Count }; string serialized = JsonConvert.SerializeObject(resultWrapper, Formatting.Indented);
以上三种方案都能生成你期望的JSON结果:
{ "Items": [ "Test1", "Test2" ], "NextPageLink": null, "Count": 2 }
内容的提问来源于stack exchange,提问作者Paolo
相关产品推荐
相关产品推荐

