Jackson注解 @JsonIgnore

@JsonIgnore的作用是忽略这个属性不被序列化或者反序列化,不管是作用于get方法,set方法还是field属性字段,都是一样的。

    @JsonIgnore
    private Date birthday;
    @Test
    public void testJson7() throws Exception{
        Person person = new Person("ABD");
        person.setAddress("河北省");
        person.setName("xuhaixing");
        person.setBirthday(new Date());
        String s = mapper.writeValueAsString(person);
        System.out.println(s);
        String str = "{\"id\":\"ABD\",\"name\":\"xuhaixing\",\"birthday\":1539183966844,\"address\":\"河北省\"}";
        Person person1 = mapper.readValue(str, Person.class);
        System.out.println(person1);
    }

 

**实时内容请关注微信公众号,公众号与博客同时更新:程序员星星**

<think>嗯,用户的问题是关于Jackson库的@JsonIgnore注解的使用和常见问题。从用户的描述和引用的内容来看,用户可能正在处理JSON序列化,特别是需要忽略某些敏感字段如密码的情况。用户提供的三个引用都涉及JSON处理的相关注解。引用[1]和[2]直接提到了@JsonIgnore,说明用户可能遇到了字段序列化控制的问题。引用[3]则补充了其他JSON处理注解,表明用户可能需要更全面的参考方案。用户特别提到“常见问题及解决方案”,说明ta可能在实践中遇到了具体障碍,比如双向忽略导致的数据缺失问题。在之前的回答中,用户的问题似乎被系统错误替换为无关的引用内容,但用户仍明确表示想了解@JsonIgnore的具体应用。因此需要围绕三点展开:基础用法、典型问题(尤其是引用[2]提到的双向忽略)、解决方案(如替换为@JsonPropertyAccess)。用户可能是Java后端开发者,正调试用户对象的密码字段序列化。常见的痛点场景可能是:前端调用接口时未收到密码字段(误用@JsonIgnore导致反序列化忽略),或安全要求阻止密码出现在任何JSON响应中。需要强调“仅序列化忽略”与“完全忽略”的区别,这也是引用[2]的核心警示点。解决方案部分要突出实用性和兼容性。替代方案@JsonView和@JsonPropertyAccess都需要配合使用场景说明,例如权限控制场景适合用@JsonView动态过滤。如果用户涉及跨模块协作(如微服务),还需考虑DTO映射的可能性。</think> 以下为 `@JsonIgnore` 注解的使用指南及常见问题解决方案,结合 Jackson 库的特性整理: --- ### **一、`@JsonIgnore` 基础用法** #### 1. **字段级忽略序列化** ```java public class User { private String name; @JsonIgnore // 序列化/反序列化均忽略 password 字段 private String password; } ``` - **效果**:`password` 字段不会出现在 JSON 输出中,**也不接受** JSON 输入赋值(双向忽略)[^2]。 #### 2. **仅忽略序列化(输出时隐藏)** ```java public class User { private String name; @JsonProperty(access = Access.WRITE_ONLY) private String password; // 可接受输入但输出隐藏 } ``` - **替代方案**:需同时支持反序列化(如接收前端传入的密码)但输出时隐藏。 --- ### **二、常见问题及解决方案** #### 1. **问题:误用导致双向忽略** - **场景**:使用 `@JsonIgnore` 后,前端传入的密码无法注入到对象属性。 - **原因**:`@JsonIgnore` 默认同时作用于序列化和反序列化[^2]。 - **解决**: ```java // ✅ 仅忽略序列化(输出时隐藏) @JsonProperty(access = Access.WRITE_ONLY) private String password; // ✅ 或仅忽略反序列化(禁止输入) @JsonProperty(access = Access.READ_ONLY) private String readOnlyField; ``` #### 2. **问题:关联对象循环引用** - **场景**:`User` 引用 `Order`,`Order` 又反向引用 `User`,导致序列化死循环。 - **解决**:在**双方关联字段**上加 `@JsonIgnore` ```java public class User { private String name; @JsonIgnore // 打断循环引用 private List<Order> orders; } public class Order { private String id; private User user; // 不需要额外注解 } ``` #### 3. **问题:动态忽略字段** - **场景**:根据不同接口动态隐藏字段(如:管理员返回全部字段,普通用户隐藏邮箱)。 - **解决**:使用 `@JsonView` ```java public class Views { public static class Public {} public static class Admin extends Public {} } public class User { @JsonView(Views.Public.class) private String name; @JsonView(Views.Admin.class) // 仅管理员可见 private String email; } ``` 控制器指定视图: ```java @GetMapping("/user") @JsonView(Views.Admin.class) // 返回全部字段 public User getForAdmin() { ... } ``` --- ### **三、最佳实践** 1. **优先使用 `@JsonPropertyAccess`** 明确区分读写权限,避免误用 `@JsonIgnore` 导致意外行为[^3]。 2. **敏感字段(如密码)必须加 `WRITE_ONLY`** 确保接收输入但永不输出到客户端。 3. **循环引用用 `@JsonIgnore` 显式切断** 避免无限递归导致的栈溢出。 --- ### **扩展问题** > **Q1: 如何忽略空值字段?** > **A1**: 使用 `@JsonInclude(Include.NON_NULL)` 注解类或字段 > ```java > @JsonInclude(JsonInclude.Include.NON_NULL) > public class User { ... } > ``` > > **Q2: `@JsonIgnore` 与 `transient` 的区别?** > **A2**: > - `transient` 是 Java 关键字,阻止字段序列化(任何序列化框架) > - `@JsonIgnore` 是 Jackson 专用注解,可配置读写方向 > **Q3: 如何全局配置忽略未知字段?** > **A3**: 在 Spring Boot 中配置: > ```yaml > spring: > jackson: > deserialization: > fail-on-unknown-properties: false # 忽略JSON中的未知字段 > ``` [^1]: JSON 字段格式化基础 [^2]: `@JsonIgnore` 的双向忽略特性 [^3]: JSON 数据处理的最佳实践 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值