You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:08:28