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