【Jackson】Jackson的使用

本文详细介绍了Jackson库的基本概念、核心模块以及如何将对象转换成JSON和从JSON转换成对象。此外,还展示了Jackson节点的使用方法,包括获取JSON数据、解析JSON数组和对象。最后,探讨了Jackson的注解使用,如@JsonIgnore、@JsonIgnoreProperties、@JsonProperty等,用于控制序列化和反序列化过程中的属性处理。
摘要由CSDN通过智能技术生成

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);
  • 结果
    在这里插入图片描述

将json转换成对象

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

在这里插入图片描述

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的注解使用

  • @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 {}

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值