Автор оригинала: mkyong.
В Джексоне мы можем использовать @JsonView
для ограничения или управления отображением полей для разных пользователей.
POJO для тестирования.
package com.mkyong; public class Staff { private String name; private int age; private String[] position; private Listskills; private Map salary; // getters , setters , boring stuff }
P.S Протестировано с Джексоном 2.9.8
1. Просмотры
Стандартный класс Java для определения 3 представлений: обычный, менеджер и hr.
package com.mkyong; public class CompanyViews { public static class Normal{}; public static class Manager extends Normal{}; public static class HR extends Normal{}; }
2. Представление в формате Json
Помещает @JsonView
на уровень поля, чтобы ограничить отображение полей для разных представлений.
- Обычный – отображаемое имя и возраст.
- Менеджер – отображаемое имя, возраст, должность и навыки
- HR – отображаемое имя, возраст, зарплата и должность
P.S Менеджер не имеет права просматривать поле зарплаты, а отделу кадров все равно, какими навыками вы обладаете 🙂
package com.mkyong; import com.fasterxml.jackson.annotation.JsonView; import java.math.BigDecimal; import java.util.Arrays; import java.util.List; import java.util.Map; 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 Listskills; @JsonView(CompanyViews.HR.class) private Map salary;
3. Джексон – Включить @JsonView
3.1 Ниже приведен пример, показывающий, как включить JsonView
с помощью mapper.writerwithview()
package com.mkyong; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import java.io.IOException; import java.math.BigDecimal; import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class JacksonExample { 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 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("mkyong"); staff.setAge(38); staff.setPosition(new String[]{"Founder", "CTO", "Writer"}); Mapsalary = 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 } }
Рекомендации
- Джексон – Как игнорировать пустые поля
- @JsonView на весеннем MVC
- Привязка данных Джексона
- Джексон 2 – Преобразование объекта Java в/из JSON
Оригинал: “https://mkyong.com/java/jackson-jsonview-examples/”