爪哇基础 之 使用 Jackson 处理 JSON 序列化与反序列化

专属目录

  • 爪哇基础 之 使用 Jackson 处理 JSON 序列化与反序列化
    • 前言
    • Jackson 简介
    • 特点
    • Jackson的json库
    • Jackson 的 核心模块
    • 注意
    • 下载
      • 注意
      • maven 方式
      • jar 引入方式
    • 前提
    • Jackson 的核心类
      • ObjectMapper
    • JSON序列化
      • 实例
    • JSON反序列化
      • 实例
    • Jackson 的 注解的使用
    • 总结

爪哇基础 之 使用 Jackson 处理 JSON 序列化与反序列化

前言

日常Java开发中也就自然而然的经常会遇到JSON的序列化与反序列化,而面对JSON序列化工具我们常用的有阿里的 FastjsonSpring MVC 内置的 Jackson还有谷歌的Gson,前面我们也说了 谷歌的Gson,若不知道的小伙伴可点击查看 ,那么今天我们来说下 Spring MVC 内置的 Jackson 是如何处理 JSON 序列化与反序列化!

Jackson 简介

Jackson 是一个 Java 用来处理 JSON 格式数据的的类库,性能非常好,功能非常强大。除了支持常用的json,同时还支持 Smile,BSON,XML,CSV,YAML。

特点

  • Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快

  • 运行时占用内存比较低,性能比较好

  • 有灵活的 API,可以很容易进行扩展和定制。

Jackson的json库

Jacksonjson库 提供了3种API

  • Streaming API : 性能最好

  • Tree Model : 最灵活

  • Data Binding : 最方便

其中最常用的就是Data Binding,为什么呢?

因为 Data Binding 中使用的 ObjectMapper线程安全的,所以应该重用。

Jackson 的 核心模块

  • jackson-core

    核心包,提供基于”流模式”解析的相关 API,它包括 JsonPaser 和 JsonGenerator。 Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json。

  • jackson-annotations

    注解包,提供标准注解功能;

  • jackson-databind

    数据绑定包, 提供基于”对象绑定” 解析的相关 API ( ObjectMapper ) 和”树模型” 解析的相关 API (JsonNode);基于”对象绑定” 解析的 API 和”树模型”解析的 API 依赖基于”流模式”解析的 API。

注意

Jackson 是基于 JavaBean 来序列化属性的,所以必须写 set与get 方法 。如果属性没有 GETTER 方法,默认是不会输出该属性的

下面我们来说下 Jackson 的常用的方法,想要使用前肯定得先下载 Jackson 的jar 包

下载

注意

如果小伙伴们使用的是 SpringSpring MVCSpring Boot 项目,可以不需要下载 jar 包导包 , 因为 Spring MVC 内置了 Jackson 的依赖包

若是基础的 Web 项目可看下如何下载 Jackson

maven 方式

pom.xml 直接引入 Gson 依赖


<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-coreartifactId>
    <version>2.9.9version>
dependency>

<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-annotationsartifactId>
    <version>2.9.9version>
dependency>

<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-databindartifactId>
    <version>2.9.9version>
dependency>

jar 引入方式

直接复制以下链接下载对应的 jar 包,引入项目的 lib 目录下即可

  • Central Maven repository

https://repo1.maven.org/maven2/com/fasterxml/jackson/core

  • Wiki

https://github.com/FasterXML/jackson-core/wiki

下载好了接下来我们就看看如何使用!

前提

上边简介也说了, Jackson 主要是用来处理 Java 的 JSON 格式数据的的类库

那首先肯定要创建一个 Java 实体类

实体类 Student.java

package com.gsontest.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @ClassName: Student
 * @Description: (描述)
 * @Author: WHT
 * @Version: V1.0
 * @Date: 2020/10/23 15:29
 */

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {

    private Integer no;

    private String name;

    private String sex;

    private Integer age;

}

Jackson 的核心类

前面我们也说了 Jackson 最常用的是 Data Binding ,那么在使用Jackson之前,我们先来了解一下Jackson中的一个核心类—— ObjectMapper

因为Jackson的所有JSON操作都在使用该类的API

ObjectMapper

ObjectMapper 是 JSON 操作的核心,它有多个 JSON 序列化的方法,可以把 JSON 字符串保存File、OutputStream 等不同的介质中

ObjectMapper 通过 writeValue 系列方法 将 java 对 象序列化 为 json,并 将 json 存 储成不同的格式,String(writeValueAsString),Byte Array(writeValueAsString),Writer, File,OutStream 和 DataOutput。

ObjectMapper 通过 readValue 系列方法从不同的数据源像 String , Byte Array, Reader,File,URL, InputStream 将 json 反序列化为 java 对象。

下面来说下 ObjectMapper 几个 writeValue 主要使用的方法

  • writeValue(File arg0, Object arg1)

    arg1转成json序列,并保存到arg0文件中

  • writeValue(OutputStream arg0, Object arg1)

    arg1转成json序列,并保存到arg0输出流中

  • writeValueAsBytes(Object arg0)

    arg0转成json序列,并把结果输出成字节数组

  • writeValueAsString(Object arg0)

    arg0转成json序列,并把结果输出成字符串

readValue 主要的使用方法

  • readValue (String content, Class valueType)

    json序列字符串转成valueType对象,并把结果输出所映射的对象

这些方法使用起来都十分简单!下面我们就来用代码演示下如何使用!

JSON序列化

把 Java 实体对象转换为 json(「序列化」)

实例

这里就只介绍下 writeValueAsString(Object obj)的使用方法,用于将Java对象转换为一个JSON字符串

package com.gsontest.test;


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gsontest.bean.Student;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: JacksonToJsonTest
 * @Description: (描述)
 * @Author: WHT
 * @Version: V1.0
 * @Date: 2020/11/3 16:16
 */
public class JacksonToJsonTest {

    public static void main(String[] args) throws JsonProcessingException {


        //创建 Student 实体类
        Student studentOne = new Student(1001, "序列化实体一", "男", 28);

        Student studentTwo = new Student(2001, "序列化实体二", "女", 20);


        ObjectMapper objectMapper = new ObjectMapper();

        //Student类转JSON
        //Student类转JSON 的结果为 :
        //{"no":1001,"name":"序列化实体一","sex":"男","age":28}
        String json = objectMapper.writeValueAsString(studentOne);
        System.out.println("Student类转JSON 的结果为 :\n" + json  + "\n");

        //Java集合转JSON
        //Java集合转JSON 的结果为 :
        //[{"no":1001,"name":"序列化实体一","sex":"男","age":28},{"no":2001,"name":"序列化实体二","sex":"女","age":20}]
        List<Student> studentList = new ArrayList<Student>();
        studentList.add(studentOne);
        studentList.add(studentTwo);

        String jsonList = objectMapper.writeValueAsString(studentList);
        System.out.println("Java集合转JSON 的结果为 :\n" + jsonList);

    }

}

运行结果

Student类转JSON 的结果为 :
{"no":1001,"name":"序列化实体一","sex":"男","age":28}

Java集合转JSON 的结果为 :
[{"no":1001,"name":"序列化实体一","sex":"男","age":28},{"no":2001,"name":"序列化实体二","sex":"女","age":20}]

JSON反序列化

Jackson 提供了许多JSON反序列化的方法,其中比较常用的方法 就是 readValue

实例

具体将 json 转换为 实体对象List 集合对象可见以下代码示例

package com.gsontest.test;


import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.gsontest.bean.Student;

import java.io.IOException;
import java.util.List;

/**
 * @ClassName: JacksonFromJsonTest
 * @Description: (描述)
 * @Author: WHT
 * @Version: V1.0
 * @Date: 2020/11/3 17:42
 */
public class JacksonFromJsonTest {


    public static void main(String[] args) throws IOException {

        //上文实例代码 序列化的 json 字符串
        String json = "{\"no\":1001,\"name\":\"序列化实体一\",\"sex\":\"男\",\"age\":28}";

        String jsonList = "[{\"no\":1001,\"name\":\"序列化实体一\",\"sex\":\"男\",\"age\":28},{\"no\":2001,\"name\":\"序列化实体二\",\"sex\":\"女\",\"age\":20}]";


        /*
         * ObjectMapper支持 String , Byte Array, Reader,File,URL, InputStream 等 将 json 反序列化为 java 对象
         */
        ObjectMapper objectMapper = new ObjectMapper();
        Student student = objectMapper.readValue(json, Student.class);
        System.out.println("String json字符串 反序列化为 Student 对象的结果为:\n" + student  + "\n");




        /*
         * 对于 List 类型 ,可以调用 constructCollectionType 方法来序列化,也可以构造 TypeReference 来序列化。
         */

        // 方法一 : 调用 constructCollectionType 方法来序列化
        CollectionType javaType = objectMapper.getTypeFactory().constructCollectionType(List.class, Student.class);
//        List studentList = objectMapper.readValue(jsonList, javaType);

        //方法二 : 构造 TypeReference 来序列化
        List<Student> studentList = objectMapper.readValue(jsonList, new TypeReference<List<Student>>(){});

        System.out.println("studentList 集合遍历的结果:");

        for (Student stu : studentList) {
            System.out.println(stu);
        }
    }
}

运行结果

String json字符串 反序列化为 Student 对象的结果为:
Student(no=1001, name=序列化实体一, sex=, age=28)

studentList 集合遍历的结果: 
Student(no=1001, name=序列化实体一, sex=, age=28)
Student(no=2001, name=序列化实体二, sex=, age=20)

实例到这就讲解完了!下面我们来看下 Jackson 的注解的使用!

Jackson 的 注解的使用

Jackson 根据它的默认方式序列化和反序列化 java 对象,若根据实际需要,灵活的调整它的默认方式,可以使用 Jackson 的注解。

Jackson 常用的注解及用法如下

注解 用法
@JsonProperty 用于属性,把属性的名称序列化时转换为另外一个名称。示例: @JsonProperty(“str_name”) private String name;
@JsonFormat 用于属性或者方法,把属性的格式序列化时转换成指定的格式。示例: @JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm”) public Date cDate()
@JsonPropertyOrder 用于类, 指定属性在序列化时 json 中的顺序 , 示例: @JsonPropertyOrder({ “str_name”, “age” }) public class Student
@JsonCreator 用于构造方法,和 @JsonProperty 配合使用,适用有参数的构造方法。 示例: @JsonCreator public Student(@JsonProperty(“name”)String name) {…}
@JsonAnySetter 用于属性或者方法,设置未反序列化的属性名和值作为键值存储到 map 中 @JsonAnySetter public void set(String key, Object value) { map.put(key, value); }
@JsonAnyGetter 用于方法 ,获取所有未序列化的属性 public Map any() { return map; }

后续我们详细说下Jackson 的 注解是如何使用的,这里只简单描述下。

总结

看到这,Java 的 Jackson 是如何处理 JSON的序列化与反序列化就到此完结了,是不是非常nice,数据交互起来就更完美!快去试一试吧!别着急,还有更多的秘密等着你来探索!

爪哇基础 之 使用 Jackson 处理 JSON 序列化与反序列化_第1张图片

分享嗨起来,美德传起来,点个星标从此探索之路不迷茫!

微信扫描二维码,关注我的原创日更公众号,可以查看更多程序的秘密!

爪哇基础 之 使用 Jackson 处理 JSON 序列化与反序列化_第2张图片

你可能感兴趣的:(Java,java)