生成 JSON 格式字符串通常使用的是 JSON 序列化器,Java 中最常用的序列化器是 Jackson。要隐藏关键属性,我们可以使用 Jackson 提供的注解 @JsonIgnore
,该注解可以标记某个属性在序列化时不进行序列化。
下面是完整的攻略步骤:
在 pom.xml 文件中导入 Jackson 相关的依赖。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.4</version>
</dependency>
定义一个 JavaBean,里面包含要隐藏的关键属性。
public class User {
private String name;
private Integer age;
@JsonIgnore
private String password;
// 省略 getter/setter 方法
}
上面的例子中,我们使用了 @JsonIgnore
注解标注了 password
属性,这个属性在序列化时将会被忽略。
在代码中使用 Jackson 序列化器,把 JavaBean 序列化为 JSON 字符串。
ObjectMapper mapper = new ObjectMapper();
User user = new User();
user.setName("张三");
user.setAge(20);
user.setPassword("123456");
String json = mapper.writeValueAsString(user);
System.out.println(json);
输出的结果是:
{"name":"张三","age":20}
可以看到,password
属性已经被忽略了。
在 Spring Boot 中使用 Jackson 的 @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
注解可以简单的隐藏关键属性。下面的例子演示了在 Spring Boot 中使用注解隐藏密码属性。
在 User
类中添加注解。
public class User {
private String name;
private Integer age;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;
// 省略 getter/setter 方法
}
在 Spring Boot 中写一个控制器,返回 User 对象。
@RestController
public class UserController {
@GetMapping("/user")
public User getUser() {
User user = new User();
user.setName("张三");
user.setAge(20);
user.setPassword("123456");
return user;
}
}
当访问 /user
接口时,返回的 JSON 数据将不包含密码属性。
在某些情况下,我们需要对一个已经存在的类做特殊处理,例如隐藏某些敏感信息。这时候,我们可以手动配置 ObjectMapper。
public class User {
private String name;
private Integer age;
private String password;
// 省略 getter/setter 方法
}
public class Main {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
SimpleBeanPropertyFilter simpleFilter = SimpleBeanPropertyFilter
.serializeAllExcept("password");
FilterProvider filterProvider = new SimpleFilterProvider()
.addFilter("myFilter", simpleFilter);
mapper.setFilterProvider(filterProvider);
User user = new User();
user.setName("张三");
user.setAge(20);
user.setPassword("123456");
String json = mapper.writerWithFilter(filterProvider).writeValueAsString(user);
System.out.println(json);
}
}
在上面的代码中,我们自定义了一个 SimpleBeanPropertyFilter,并把它放到了一个 SimpleFilterProvider 中,添加了一个过滤器名字为 myFilter
。然后,我们把整个 FilterProvider 设置到了 ObjectMapper 中。
当使用 writeValueAsString()
方法序列化对象时,我们指定了使用在 ObjectMapper 中定义的 myFilter
过滤器。这样,序列化后的 JSON 数据将不包含 password
属性。