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
相关产品推荐
相关产品推荐

