ASP.NET Core中如何配置[JsonIgnore]仅在API返回时忽略标注属性,入参不忽略?
ASP.NET Core 实现单向JSON忽略的配置方案
默认无参数的[JsonIgnore]特性会在序列化(API响应输出)和反序列化(客户端请求接收)两个阶段都跳过目标属性,要实现“响应时隐藏字段、请求时正常接收字段”的需求,只需要根据使用的.NET 版本调整特性的配置参数即可,不需要编写复杂的自定义序列化逻辑。
.NET 8 及以上版本:直接调整特性参数
ASP.NET Core 默认使用的JSON序列化组件为System.Text.Json,该组件在.NET 8版本中补充了精准的忽略时机控制,只需要给[JsonIgnore]指定对应的Condition参数,就能直接匹配需求:
public class User { public int Id { get; set; } public string UserName { get; set; } // 序列化阶段无条件忽略该属性,反序列化阶段正常处理传入值 [JsonIgnore(Condition = JsonIgnoreCondition.WhenWriting)] public string Password { get; set; } }
该配置的实际运行效果:
- 当API将User对象序列化为响应JSON时,无论Password属性存储了什么值,都不会被包含在返回内容中,可有效避免密码等敏感信息泄露;
- 当客户端发送的请求JSON中携带Password字段时,反序列化过程会正常将值赋值到User对象的Password属性上,不会丢失传入的参数值。
.NET 7 及更早版本:等效实现方式
旧版本的System.Text.Json没有提供JsonIgnoreCondition.WhenWriting枚举值,无法通过单一特性参数直接实现单向忽略,此时可以通过调整属性访问器的方式实现同样的效果,不需要依赖自定义序列化逻辑:
public class User { public int Id { get; set; } public string UserName { get; set; } // 公开set访问器:反序列化时可正常写入JSON传入的参数值 // 私有get访问器:序列化时无法读取属性值,自然不会被输出到响应JSON中 public string Password { private get; set; } }
这种方式的实现原理是:System.Text.Json 默认只会序列化带有公开get访问器的属性,对非公开get的属性会自动跳过;而反序列化过程只要存在公开的set访问器,就可以正常完成参数绑定,刚好匹配“入站接收、出站隐藏”的需求。
常见配置误区
- 不要直接使用无参数的默认
[JsonIgnore],默认对应Condition = JsonIgnoreCondition.Always,会在序列化和反序列化两个阶段都忽略属性,导致客户端传入的Password值无法被正常读取; - 不要错配
JsonIgnoreCondition.WhenWritingDefault或JsonIgnoreCondition.WhenWritingNull,这两个配置只会在属性值为默认值或null时才跳过序列化,如果属性被赋予了非默认值(比如用户提交的明文密码),还是会被序列化到响应中,存在敏感信息泄露的风险。
内容的提问来源于stack exchange,提问作者Szyszka947
相关产品推荐
相关产品推荐

