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

Postman调用Asp.net Core WebApi响应多出$id、$values字段解决方法

问题原因

接口响应中出现非预期的$id、$values字段,是项目使用Newtonsoft.Json作为JSON序列化组件时,开启了引用保留配置导致的。该配置原本用于处理对象循环引用、复用相同对象引用减少序列化体积,但会自动为所有对象生成$id元数据,同时将所有集合类型包装为带$values字段的对象结构,和常规JSON数组结构不符。

解决方案

根据实际配置场景选择对应处理方式即可:

  • 全局配置修复(绝大多数场景适用)
    找到项目中配置控制器服务的位置,修改Newtonsoft.Json序列化配置,关闭引用保留即可:
    .NET 6+ (使用顶层语句的Program.cs):
    builder.Services.AddControllers()
        .AddNewtonsoftJson(options =>
        {
            // 关闭引用元数据生成,移除$id、$values字段
            options.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None;
            // 配置循环引用处理规则为忽略,避免序列化报错
            options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        });
    
    .NET 5及更早版本(使用Startup.cs):
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers()
            .AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None;
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            });
    }
    
    修改完成后重启应用,接口返回的集合会直接序列化为标准JSON数组,嵌套的空集合也会直接返回[],不再有多余包装字段。
  • 单接口单独配置(全局需要保留引用处理时使用)
    如果全局配置需要保留引用处理逻辑,仅需要个别接口返回标准JSON结构,可以在对应接口中单独指定序列化规则:
    public IActionResult GetFormConfigList()
    {
        var result = // 业务查询得到的结果集
        var customSettings = new JsonSerializerSettings
        {
            PreserveReferencesHandling = PreserveReferencesHandling.None,
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
        };
        return Json(result, customSettings);
    }
    
  • 模型特性检查
    如果没有手动修改过全局Newtonsoft.Json配置,检查返回的模型类是否标记了[DataContract(IsReference = true)]特性,该特性同样会触发序列化器生成引用元数据,移除特性或将IsReference属性设为false即可解决。
修复后预期响应结构

配置生效后,示例接口将返回如下标准结构:

[
    {
        "tenentId": 21,
        "language": 1,
        "formId": "EmployeeGrid",
        "formName": "Employee Grid",
        "headerName": "KU Employee Main Grid",
        "subHeader": "Main Grid of the Employee Master",
        "navigation": "MainMenu>View Contact>Add New Contact",
        "remarks": "",
        "status": "",
        "formTitleDts": []
    },
    {
        "tenentId": 21,
        "language": 2,
        "formId": "EmployeeGrid",
        "formName": "Employee Grid",
        "headerName": "KU Employee Main Grid",
        "subHeader": "Main Grid of the Employee Master",
        "navigation": "MainMenu>View Contact>Add New Contact",
        "remarks": "",
        "status": "",
        "formTitleDts": []
    }
]

内容的提问来源于stack exchange,提问作者Shakir Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:30:48