在 Jackson 中,我们可以使用@JsonView来限制或控制不同用户的字段显示。
1. Pojo对象@Data
public class Staff {
private String name;
private int age;
private String[] position;
private List skills;
private Map salary;
}
2. 定义3个类
一个标准的 Java 类,用于定义 3 个视角:normal、manager 和 hr。
public class CompanyViews {
public static class Normal{};
public static class Manager extends Normal{};
public static class HR extends Normal{};
}
3. json视角
@JsonView置于字段级别以限制不同视角的字段显示。
- 正常 —— 显示姓名和年龄。
- 经理 —— 显示姓名、年龄、职位和技能
- HR —— 显示姓名、年龄、薪水和职位
@Data
public class Staff {
@JsonView(CompanyViews.Normal.class)
private String name;
@JsonView(CompanyViews.Normal.class)
private int age;
// two views
@JsonView({CompanyViews.HR.class, CompanyViews.Manager.class})
private String[] position;
@JsonView(CompanyViews.Manager.class)
private List skills;
@JsonView(CompanyViews.HR.class)
private Map salary;
}
4. 启用 @JsonView
下面的例子,告诉你如何启用JsonView使用mapper.writerWithView()
public class JacksonExample1 {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
Staff staff = createStaff();
try {
// to enable pretty print
mapper.enable(SerializationFeature.INDENT_OUTPUT);
// normal
String normalView = mapper.writerWithView(CompanyViews.Normal.class).writeValueAsString(staff);
System.out.format("Normal viewsn%sn", normalView);
// manager
String managerView = mapper.writerWithView(CompanyViews.Manager.class).writeValueAsString(staff);
System.out.format("Manager viewsn%sn", managerView);
// hr
String hrView = mapper.writerWithView(CompanyViews.HR.class).writeValueAsString(staff);
System.out.format("HR viewsn%sn", hrView);
} catch (IOException e) {
e.printStackTrace();
}
}
private static Staff createStaff() {
Staff staff = new Staff();
staff.setName("mkyong");
staff.setAge(38);
staff.setPosition(new String[]{"Founder", "CTO", "Writer"});
Map salary = new HashMap() {{
put("2010", new BigDecimal(10000));
put("2012", new BigDecimal(12000));
put("2018", new BigDecimal(14000));
}};
staff.setSalary(salary);
staff.setSkills(Arrays.asList("java", "python", "node", "kotlin"));
return staff;
}
}
输出:
Normal views
{
"name" : "mkyong",
"age" : 38
}
Manager views
{
"name" : "mkyong",
"age" : 38,
"position" : [ "Founder", "CTO", "Writer" ],
"skills" : [ "java", "python", "node", "kotlin" ]
}
HR views
{
"name" : "mkyong",
"age" : 38,
"position" : [ "Founder", "CTO", "Writer" ],
"salary" : {
"2018" : 14000,
"2012" : 12000,
"2010" : 10000
}
}



