-
Jackson的简介
Jackson作为一个知名,并且经典的Java平台的JSON库,有人说它是最好的JSON解析工具,或者只是一个简单的还行的JSON解析库,不管如何Jackson都是一个值得一学,值得一用的JSON处理库。
Jackson不仅支持流式处理json,还支持数据绑定(POJO和JSON之间的相互转化),甚至还拓展了很多其他第三方库所支持的数据格式(如:Avro, BSON, CBOR, CSV, Smile, (Java) Properties, Protobuf, XML和YAML,Guava, Joda, PCollections)。 -
Jackson的三个核心模块
jackson-core : 核心包 定义了低级的流式API,包括了JSON处理细节。
jackson-annotations : 注解包 包含了Jackson的注解。
jackson-databind : 数据绑定包 实现了对象和JSON之间的转换,这个包依赖上面两个包。
- 首先要导入pom依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
将对象转换成json
- 自定义一个Person类,有name,age,address三个属性
public class Person {
private String name;
private int age;
private String address;
@Override
public String toString() {
return name + "\t" + age + "\t" + address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
- 实例化一个Person类,赋值,并且将其转换成json类型
Person person = new Person("张三",20,"南京");
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(person);
System.out.println(json);
-
结果
将json转换成对象
String json2 = mapper.writeValueAsString(new Person("张三",20,"南京"));
Person person = mapper.readValue(json2,Person.class);
System.out.println(person);
使用的数据
{"name":"张三","age":20,"pets":[{"name":"旺财","color":"灰色"},{"name":"富贵","color":"黑色"},{"name":"狗蛋","color":"白色"}]}
JsonNode root = mapper.readTree(str);
//取的年龄并且转换成int类型
int age = root.get("age").asInt();
System.out.println("年龄是:"+age);
//取得pets数组
JsonNode jsonNode = root.get("pets");
System.out.println("pets数组是:"+jsonNode.toString());
//取得数组里的第二个宠物信息
JsonNode jsonNode1 = jsonNode.get(1);
System.out.println("第二个宠物的信息:"+jsonNode1.toString());
//取得第二个宠物的名字
String petName = jsonNode1.get("name").asText();
System.out.println("第二个宠物叫:"+petName);
- @JsonIgnore
在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响
//在Person类address属性上面加上@JsonIgnore
@JsonIgnore
private String address;
//定义person序列化和·反序列化
Person p1 = new Person("张三", 20, "南京");
String j1 = mapper.writeValueAsString(p1);
Person p2 = mapper.readValue(j1, Person.class);
System.out.println(j1);
System.out.println(p2);
空间address不论是序列化还是反序列化都没有
- @JsonIgnoreProperties
和 @JsonIgnore 的作用相同,都是告诉 Jackson 该忽略哪些属性,
不同之处是 @JsonIgnoreProperties 是类级别的,并且可以同时指定多个属性
//在Person类上加上,其他的不变
@JsonIgnoreProperties(value = {"age","address"})
public class Person {...}
@JsonIgnoreProperties注解提到的几个全部被忽略
- @JsonProperty
它用于属性上,作用是把属性的名称序列化成另外一个名称
//将address重命名为add
@JsonProperty(value = "add")
private String address;
空间address已经被改名为add
@JsonProperty(value=“name”,required=true,defaultValue=“1”)
还有其他几个作用,重命名变量名,required是否是必要属性必要属性不能空,默认值
- @JsonInclude(JsonInclude.Include.NON_NULL)
这个注解表示,如果值为null,则不返回,还可以在类上添加这个注释,当实体类与json互相转换的时候,属性值为null的不参与序列化
//如果address为空就不返回
@JsonInclude(JsonInclude.Include.NON_NULL)
private String address;
//实例化的时候将address设置为空
Person p1 = new Person();
p1.setName("张三");
p1.setAge(20);
String j1 = mapper.writeValueAsString(p1);
Person p2 = mapper.readValue(j1, Person.class);
System.out.println(j1);
System.out.println(p2);
- @JsonPropertyOrder
指定属性的顺序
//指定顺序在Person类上
@JsonPropertyOrder({"address","name","age"})
public class Person {}