Jackson的基本概念
  • 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之间的转换,这个包依赖上面两个包。

Jackson的基本使用
  • 首先要导入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);
  • 结果
    【Jackson】Jackson的使用_xml

将json转换成对象

        String json2 = mapper.writeValueAsString(new Person("张三",20,"南京"));
        Person person = mapper.readValue(json2,Person.class);
        System.out.println(person);

【Jackson】Jackson的使用_序列化_02

Jackson节点的使用
使用的数据
{"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);

【Jackson】Jackson的使用_java_03

Jackson的注解使用
  • @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不论是序列化还是反序列化都没有
【Jackson】Jackson的使用_反序列化_04

  • @JsonIgnoreProperties
    和 @JsonIgnore 的作用相同,都是告诉 Jackson 该忽略哪些属性,
    不同之处是 @JsonIgnoreProperties 是类级别的,并且可以同时指定多个属性
//在Person类上加上,其他的不变
@JsonIgnoreProperties(value = {"age","address"})
public class Person {...}

@JsonIgnoreProperties注解提到的几个全部被忽略
【Jackson】Jackson的使用_java_05

  • @JsonProperty
    它用于属性上,作用是把属性的名称序列化成另外一个名称
//将address重命名为add
    @JsonProperty(value = "add")
    private String address;

空间address已经被改名为add
【Jackson】Jackson的使用_序列化_06
@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);

【Jackson】Jackson的使用_序列化_07

  • @JsonPropertyOrder
    指定属性的顺序
//指定顺序在Person类上
@JsonPropertyOrder({"address","name","age"})
public class Person {}

【Jackson】Jackson的使用_json_08