Джексон предоставить Значение записи()
и чтение значения()
методы преобразования объектов Java в/из JSON.
mapper.writeValue
– Объекты Java в JSON
ObjectMapper mapper = new ObjectMapper(); // Java object to JSON file mapper.writeValue(new File("c:\\test\\staff.json"), new Staff()); // Java object to JSON string, default compact-print String jsonString = mapper.writeValueAsString(new Staff()); // pretty-print String jsonString2 = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(new Staff());
mapper.Значение чтения
– JSON для объектов Java
ObjectMapper mapper = new ObjectMapper(); //JSON file to Java object Staff obj = mapper.readValue(new File("c:\\test\\staff.json"), Staff.class); //JSON URL to Java object Staff obj = mapper.readValue(new URL("http://some-domains/api/staff.json"), Staff.class); //JSON string to Java Object Staff obj = mapper.readValue("{'name' : 'mkyong'}", Staff.class);
P.S Протестировано с Джексоном 2.9.8
1. Скачать Джексон
Объявляет Джексон-привязка данных
, он будет втягиваться джексон-аннотации
и джексон-ядро
com.fasterxml.jackson.core jackson-databind 2.9.8
$ mvn dependency:tree \- com.fasterxml.jackson.core:jackson-databind:jar:2.9.8:compile [INFO] +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0:compile [INFO] \- com.fasterxml.jackson.core:jackson-core:jar:2.9.8:compile
2. ПОЖО
Простой объект Java, POJO, для последующего тестирования.
public class Staff { private String name; private int age; private String[] position; // Array private Listskills; // List private Map salary; // Map // getters , setters, some boring stuff }
3. Объекты Java для JSON
package com.mkyong; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class JacksonExample1 { public static void main(String[] args) { ObjectMapper mapper = new ObjectMapper(); Staff staff = createStaff(); try { // Java objects to JSON file mapper.writeValue(new File("c:\\test\\staff.json"), staff); // Java objects to JSON string - compact-print String jsonString = mapper.writeValueAsString(staff); System.out.println(jsonString); // Java objects to JSON string - pretty-print String jsonInString2 = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(staff); System.out.println(jsonInString2); } 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; } }
Выход
{"name":"mkyong","age":38,"position":["Founder","CTO","Writer"],"skills":["java","python","node","kotlin"],"salary":{"2018":14000,"2012":12000,"2010":10000}}
{"name":"mkyong","age":38,"position":["Founder","CTO","Writer"],"skills":["java","python","node","kotlin"],"salary":{"2018":14000,"2012":12000,"2010":10000}} { "name" : "mkyong", "age" : 38, "position" : [ "Founder", "CTO", "Writer" ], "skills" : [ "java", "python", "node", "kotlin" ], "salary" : { "2018" : 14000, "2012" : 12000, "2010" : 10000 } }
4. JSON в объект Java
package com.mkyong; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.IOException; public class JacksonExample2 { public static void main(String[] args) { ObjectMapper mapper = new ObjectMapper(); try { // JSON file to Java object Staff staff = mapper.readValue(new File("c:\\test\\staff.json"), Staff.class); // JSON string to Java object String jsonInString = "{\"name\":\"mkyong\",\"age\":37,\"skills\":[\"java\",\"python\"]}"; Staff staff2 = mapper.readValue(jsonInString, Staff.class); // compact print System.out.println(staff2); // pretty print String prettyStaff1 = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(staff2); System.out.println(prettyStaff1); } catch (IOException e) { e.printStackTrace(); } } }
Выход
Staff{name='mkyong', age=37, position=null, skills=[java, python], salary=null} { "name" : "mkyong", "age" : 37, "position" : null, "skills" : [ "java", "python" ], "salary" : null }
5. @JsonProperty – Имя поля JSON
5.1 По умолчанию
public class Staff { private String name; private int age;
Выход
{"name":"abc", "age":38}
5.2 Измените имя свойства с помощью @JsonProperty
public class Staff { @JsonProperty("custom_name") private String name; private int age;
Выход
{"custom_name":"abc", "age":38}
6. @Jsoninclude – Игнорировать пустые поля
По умолчанию Джексон будет включать поля null
.
{ "name" : "mkyong", "age" : 38, "position" : null, "skills" : null, "salary" : null }
6.1 @Jsoninclude
на уровне класса.
import com.fasterxml.jackson.annotation.JsonInclude; // ignore null fields , class level @JsonInclude(JsonInclude.Include.NON_NULL) // ignore all null fields public class Staff { private String name; private int age; private String[] position; private Listskills; private Map salary; //...
6.2 @JSONINCLUDE
на уровне полей.
import com.fasterxml.jackson.annotation.JsonInclude; public class Staff { private String name; private int age; @JsonInclude(JsonInclude.Include.NON_NULL) //ignore null field on this property only private String[] position; private Listskills; private Map salary;
Выход
{ "name" : "mkyong", "age" : 38, "skill" : null, "salary" : null }
6.3 По всему миру.
ObjectMapper mapper = new ObjectMapper(); // ignore all null fields globally mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
7. @JsonView @JsonView
7.1 @JsonView
используется для ограничения отображения полей для разных пользователей. Например:
package com.mkyong; public class CompanyViews { public static class Normal{}; public static class Manager extends Normal{}; }
В обычном представлении отображаются только имя и возраст, в представлении менеджера могут отображаться все.
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; @JsonView(CompanyViews.Manager.class) private String[] position; @JsonView(CompanyViews.Manager.class) private Listskills; @JsonView(CompanyViews.Manager.class) private Map salary;
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); } 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" ], "salary" : { "2018" : 14000, "2012" : 12000, "2010" : 10000 } }
8. @JsonIgnore и @Jsonignor свойства
По умолчанию Джексон включает все поля, даже статические
или переходные
поля.
8.1 @JsonIgnore
игнорировать поля на уровне полей.
import com.fasterxml.jackson.annotation.JsonIgnore; public class Staff { private String name; private int age; private String[] position; @JsonIgnore private Listskills; @JsonIgnore private Map salary;
Выход
{ "name" : "mkyong", "age" : 38, "position" : [ "Founder", "CTO", "Writer" ] }
8.2 @jsonignoreproperties
игнорировать поля на уровне класса.
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties({"salary", "position"}) public class Staff { private String name; private int age; private String[] position; private Listskills; private Map salary;
Выход
{ "name" : "mkyong", "age" : 38, "skills" : [ "java", "python", "node", "kotlin" ] }
9. Часто задаваемые вопросы
9.1 Преобразовать строку массива JSON в список
String json = "[{\"name\":\"mkyong\", \"age\":38}, {\"name\":\"laplap\", \"age\":5}]"; Listlist = Arrays.asList(mapper.readValue(json, Staff[].class)); // or like this: // List list = mapper.readValue(json, new TypeReference >(){});
9.2 Преобразование строки JSON в карту
String json = "{\"name\":\"mkyong\", \"age\":\"33\"}"; Mapmap = mapper.readValue(json, Map.class); // or like this: //Map map = mapper.readValue(json, new TypeReference
Выход
[key]:name [value]:mkyong [key]:age [value]:33
9.3 Что делать, если некоторая сложная структура JSON не легко сопоставляется с классом Java? Ответ: |/Попробуйте Модель дерева Джексона преобразовать данные JSON в JsonNode
, чтобы мы могли легко добавлять, обновлять или удалять узлы JSON.
Рекомендации
- Официальный сайт, привязывающий данные Джексона
- Джексон 2 – Преобразование объекта Java в/из JSON
- Gson – Как анализировать JSON
Оригинал: “https://mkyong.com/java/jackson-how-to-parse-json/”