Jackson提供了writeValue()
和readValue()
方法来将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.readValue
– 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);
PS已在Jackson 2.9.8中测试
1.下载杰克逊
声明jackson-databind
,它将jackson-annotations
和jackson-core
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
$ 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. POJO
一个简单的Java对象POJO,供以后测试。
public class Staff {
private String name;
private int age;
private String[] position; // Array
private List<String> skills; // List
private Map<String, BigDecimal> 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"});
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;
}
}
输出量
{"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 –忽略空字段
默认情况下,Jackson将包含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 List<String> skills;
private Map<String, BigDecimal> 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 List<String> skills;
private Map<String, BigDecimal> 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);
注意
有关如何使用Jackson忽略空字段的更多示例
7. @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 List<String> skills;
@JsonView(CompanyViews.Manager.class)
private Map<String, BigDecimal> 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"});
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;
}
}
输出量
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
}
}
注意
阅读此Jackson @JsonView示例
8. @JsonIgnore和@JsonIgnoreProperties
默认情况下,Jackson包含所有字段,甚至包括static
或transient
字段。
8.1 @JsonIgnore
忽略字段级别的字段。
import com.fasterxml.jackson.annotation.JsonIgnore;
public class Staff {
private String name;
private int age;
private String[] position;
@JsonIgnore
private List<String> skills;
@JsonIgnore
private Map<String, BigDecimal> 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 List<String> skills;
private Map<String, BigDecimal> salary;
输出量
{
"name" : "mkyong",
"age" : 38,
"skills" : [ "java", "python", "node", "kotlin" ]
}
9.常见问题
String json = "[{\"name\":\"mkyong\", \"age\":38}, {\"name\":\"laplap\", \"age\":5}]";
List<Staff> list = Arrays.asList(mapper.readValue(json, Staff[].class));
// or like this:
// List<Staff> list = mapper.readValue(json, new TypeReference<List<Staff>>(){});
9.2 将JSON字符串转换为Map
String json = "{\"name\":\"mkyong\", \"age\":\"33\"}";
Map<String, String> map = mapper.readValue(json, Map.class);
// or like this:
//Map<String, String> map = mapper.readValue(json, new TypeReference<Map<String, String>>(){});
map.forEach((k, v) -> System.out.format("[key]:%s \t[value]:%s\n", k, v));
输出量
[key]:name [value]:mkyong
[key]:age [value]:33
9.3如果某些复杂的JSON结构无法轻松映射到Java类怎么办?
答:尝试使用Jackson TreeModel将JSON数据转换为JsonNode
,以便我们可以轻松地添加,更新或删除JSON节点。