In Jackson, we can use @JsonView to limit or control fields display for different users.
A POJO for testing.
Staff.java
package com.favtuts.json.jsonviews;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
public class Staff {
private String name;
private int age;
private String[] position;
private List<String> skills;
private Map<String, BigDecimal> salary;
public Staff(String name, int age) {
this.name = name;
this.age = age;
}
public Staff() {
}
// getters , setters , boring stuff
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String[] getPosition() {
return this.position;
}
public void setPosition(String[] position) {
this.position = position;
}
public List<String> getSkills() {
return this.skills;
}
public void setSkills(List<String> skills) {
this.skills = skills;
}
public Map<String,BigDecimal> getSalary() {
return this.salary;
}
public void setSalary(Map<String,BigDecimal> salary) {
this.salary = salary;
}
}
P.S Tested with Jackson 2.9.8
1. Views
A standard Java class to define 3 views: normal, manager and hr.
CompanyViews.java
package com.favtuts.json.jsonviews;
public class CompanyViews {
public static class Normal{};
public static class Manager extends Normal{};
public static class HR extends Normal{};
}
2. Json View
Puts @JsonView on field level to limit fields display for different views.
- Normal – display name and age.
- Manager – display name, age, position and skills
- HR – display name, age, salary and position
P.S Manager has no right to view the salary field, and HR doesn’t care what skills you have 🙂
Staff.java
package com.favtuts.json.jsonviews;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonView;
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<String> skills;
@JsonView(CompanyViews.HR.class)
private Map<String, BigDecimal> salary;
3. Jackson – Enable the @JsonView
3.1 Below example, show you how to enable the JsonView with mapper.writerWithView()
JacksonExample.java
package com.favtuts.json;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.favtuts.json.jsonviews.CompanyViews;
import com.favtuts.json.jsonviews.Staff;
public class JacksonJsonViews {
public static void main(String[] args) {
enableJsonView();
}
static void enableJsonView() {
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 views\n%s\n", normalView);
// manager
String managerView = mapper.writerWithView(CompanyViews.Manager.class).writeValueAsString(staff);
System.out.format("Manager views\n%s\n", managerView);
// hr
String hrView = mapper.writerWithView(CompanyViews.HR.class).writeValueAsString(staff);
System.out.format("HR views\n%s\n", hrView);
} catch (IOException e) {
e.printStackTrace();
}
}
private static Staff createStaff() {
Staff staff = new Staff();
staff.setName("favtuts");
staff.setAge(38);
staff.setPosition(new String[] { "Founder", "CTO", "Writer" });
Map<String, BigDecimal> 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;
}
}
Output
Normal views
{
"name" : "favtuts",
"age" : 38
}
Manager views
{
"name" : "favtuts",
"age" : 38,
"position" : [ "Founder", "CTO", "Writer" ],
"skills" : [ "java", "python", "node", "kotlin" ]
}
HR views
{
"name" : "favtuts",
"age" : 38,
"position" : [ "Founder", "CTO", "Writer" ],
"salary" : {
"2018" : 14000,
"2012" : 12000,
"2010" : 10000
}
}
Download Source Code
$ git clone https://github.com/favtuts/java-core-tutorials-examples
$ cd java-basic/json