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

NSwag生成代码因同名不同类型属性重复无法编译,该如何解决?

问题1:@id中@符号的作用

这里[Newtonsoft.Json.JsonProperty("@id")]的第一个参数是JSON序列化/反序列化时绑定的字段名,其中的@是上游API返回的JSON字段名本身的组成部分,不是C#的逐字标识符语法标记。
也就是说上游接口返回的JSON结构中同时存在两个id相关字段:

  • 键名为@id的字符串类型字段
  • 键名为id的数值类型字段
    NSwag生成C#代码时默认会过滤JSON字段名中的特殊符号,因此把@id和id都处理成了Id作为属性名,才导致了重名冲突。

问题2:无法控制上游API时的修复方案

不需要修改上游API,直接调整NSwag的生成配置即可解决冲突,常用方案如下:

  • 方案1:配置属性重命名规则
    打开你项目中的NSwag配置文件(通常是nswag.json),在C#生成器的配置节点下添加propertyRename映射,为两个重名字段指定不同的C#属性名:
    "csharpGenerator": {
      "propertyRename": {
        "@id": "JsonLdId",
        "id": "NumericId"
      }
    }
    
    配置后重新生成代码,两个属性会分别命名为JsonLdId和NumericId,不再重名,且JsonProperty绑定的JSON字段名保持不变,不影响接口调用。
  • 方案2:自定义属性名生成逻辑
    如果有大量类似带特殊前缀的字段,可以自定义NSwag的IPropertyNameGenerator实现,统一处理带@前缀的字段命名规则,比如自动给带@的字段属性名加At前缀,避免后续再出现同类冲突。
  • 方案3:手动修改生成的代码(不推荐)
    如果只是临时使用、不需要频繁重新生成代码,可以直接把其中一个Id属性重命名为其他名称,只要保留JsonProperty特性的原有值即可,不影响序列化反序列化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:45:06