欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

程序员文章站 2022-06-01 07:49:41
...

一、前言

之前简单的了解了一下JSON的一些类似JSON是个啥,为什么要有JSON,JSON与XML的区别,JSON的语法规则等基础概念(可跳转学习笔记:https://blog.csdn.net/qq_38586378/article/details/102989550),想着后端尤其在Java Web项目中的话应该是要学会Java与JSON的相互转换的,恰好之前毕设的时候又遇到过这个技术点,就是Jackson,就简单的做了个小demo进行记录。

二、参考链接

三、知识点及技术的简单介绍

3.1 JSON

JSON,JavaScript Object Notation,一种轻量级数据转换格式;本身就是一个字符;不受编程语言限制,支持与多种类型数据进行转换;表示方法是名称 : 值,其中名称为字符串,值可为整数、浮点数、字符串、布尔值、数组、对象和null,其中数组数据在 [] 中,对象数据在 {} 中;数据间使用 , 隔开;JSON相对于XML,数据结构更简洁,更适合于面向对象的通过RESTful API通信的应用程序开发。

3.2 Jackson

Jackson是一个简单的基于Java的应用库,可轻松完成Java对象与JSON、XML的相互转换;依赖jar包少,性能高;社区活跃,更新快。

一般处理JSON有三种方式:

  • 流式API——读取JSON并将JSON写入作为离散事件,主要涉及JsonParser和JsonGenerator方法,前者读取数据,后者写入数据。是最有效、最低开销、最快的读/写操作
  • 树模型——准备JSON文件并以树的形式保存在内存中,主要涉及JsonNode节点,readTree方法读取树
  • 数据绑定——转换JSON,主要分为简单的数据绑定和全部数据绑定。前者是转换JSON和Java的Map、List、String、整数、布尔值和null对象;后者是指将JSON转为任何的Java对象。使用ObjectMapper的writeValueAsString将Java对象转JSON,readValue方法将JSON转为Java对象

Jackson涉及三个核心模块:

  • jackson-core:定义低级的流式API,包括JSON处理细节
  • jackson-annotation:包括Jackson注解
  • jackson-databind:实现Java对象与JSON的相互转换

一般使用方法,以Spring Boot为例,直接在pom.xml配置文件中加以jackson-databind依赖即可(最好是把Jackson的三个核心模块都给加上,有一些异常处理可能需要import一下)。

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

四、实现过程

4.1 Java实体类创建

设计一个Student对象,对象属性有ID、Name、Sex、Class班级、Address、Parents(Map类型,key为father/mother,value为name和telephone),在Student类中加入构造函数和toString方法以及setter、getter方法(虽然好像后期并没有用到,但是对于private类型的属性,外界调用只能通过get和set方法/new 构造体实现对象实例化)

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

4.2 测试

4.2.1 Java对象转JSON对象

通过new Student实例化Student对象,使用ObjectMapper对象的

writeValueAsString()方法实现将Java对象转为JSON并输入。

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

输出结果为:

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

4.2.2 JSON对象转Java对象

在讲JSON对象转为Java对象的时候需要注意,如果单纯使用ObjectMapper的readValue方法,结果会报错如下

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

解决方法是在创建好的实体类的构造方法前加@JsonCreator注释,并在构造方法的参数中添加@JsonProperty注释

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

如此即可解决该问题,JSON转Java对象的方法如下图

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

结果如下:

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

4.2.3 数组转JSON对象

和Java对象转JSO类似,直接上图,将创建好的List对象以JSON格式输出

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

4.2.4 JSON对象转数组

此处需要注意,ObjectMapper的readValue方法中的第二参数应该为New TypeReference<T>() {},见下图 注意此处的TypeRerence是引用的

com.fasterxml.jackson.core.type.TypeReference

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

4.2.3与4.2.4结果图如下

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

4.2.5 如果Java对象实例化的时候有空值,JSON直接输出null(构造函数中去掉stuParents属性)

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

4.2.6 如果想输出忽略掉null值,可在实体类前面加@JsonInclue(JsonInclude.Include.Type)注释,其中Type有NON_NULL、NON_ABSENT、NON_DEFAULT、NON_EMPTY,其中NON_EMPTY指输出忽略为空的字符串。

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

使用NON_NULL输出4.2.5结果,可以看到输出Json已经忽略掉了值为null的stuParents

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

再如使用NON_EMPTY,并且恢复输出stuParents,单纯给这个Map对象初始化但是不赋值,结果输出如下,转为JSON忽略为空的stuParents 需要注意null并不等同于为空,为空是指值为空,null是根本就没有这个对象(于JSON与Java转换而言)

JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)

五、总结

通过Jackson的数据绑定方式实现Java对象和数组与JSON间的相互转换,简单了解了Jackson的使用方法,有关JSON和Jackson的学习暂时告一段落,后续有使用到的觉得值得记录的店会继续进行更新。

博客中的完整代码如下,简单的一个小demo,欢迎指正~

5.1 Student类

package com.practice.json.entity;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.List;
import java.util.Map;

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Student {
    private Integer stuID;
    private String stuName;
    private String stuSex;
    private String stuClass;
    private String stuAddr;
    /**
     * Map key is father/mother, Value is father/mother's info(name,telephone)
     */
    @JsonIgnoreProperties(ignoreUnknown = true)
    private Map<String,List<String>> stuParents;

    @JsonCreator
    public Student(@JsonProperty("stuID") Integer stuID, @JsonProperty("stuName") String stuName,
                   @JsonProperty("stuSex")String stuSex, @JsonProperty("stuClass")String stuClass,
                   @JsonProperty("stuAddr")String stuAddr,@JsonProperty("stuParents")Map<String,List<String>> stuParents) {
        this.stuID = stuID;
        this.stuName = stuName;
        this.stuSex = stuSex;
        this.stuClass = stuClass;
        this.stuClass = stuClass;
        this.stuAddr = stuAddr;
        this.stuParents = stuParents;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuID=" + stuID +
                ", stuName='" + stuName + '\'' +
                ", stuSex='" + stuSex + '\'' +
                ", stuClass='" + stuClass + '\'' +
                ", stuAddr='" + stuAddr + '\'' +
                ", stuParents=" + stuParents +
                '}';
    }

    public Integer getStuID() {
        return stuID;
    }

    public void setStuID(Integer stuID) {
        this.stuID = stuID;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public String getStuSex() {
        return stuSex;
    }

    public void setStuSex(String stuSex) {
        this.stuSex = stuSex;
    }

    public String getStuClass() {
        return stuClass;
    }

    public void setStuClass(String stuClass) {
        this.stuClass = stuClass;
    }

    public String getStuAddr() {
        return stuAddr;
    }

    public void setStuAddr(String stuAddr) {
        this.stuAddr = stuAddr;
    }

    public Map<String, List<String>> getStuParents() {
        return stuParents;
    }

    public void setStuParents(Map<String, List<String>> stuParents) {
        this.stuParents = stuParents;
    }
}

5.2 测试类

package com.practice.json;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.practice.json.entity.Student;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
class JsonApplicationTests {
    @Test
    void contextLoads() throws JsonProcessingException {

        List<String> lists = new ArrayList<String>();
        lists.add("Wang");
        lists.add("1536987452");
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        map.put("father",lists);
        Student student = new Student(101,"ciery","female","1904","xi'an",map);

        ObjectMapper mapper = new ObjectMapper();

        String jsonStrObject = mapper.writeValueAsString(student);
        System.out.println("Java object turn to JSON object: " + jsonStrObject);

        Student object = mapper.readValue(jsonStrObject,Student.class);
        System.out.println("JSON object turn to Java object: " + object.toString());


        String jsonStrList = mapper.writeValueAsString(lists);
        System.out.println("List turn to JSON object: " + jsonStrList);

        List<String> list = mapper.readValue(jsonStrList,new TypeReference<List<String>>(){});
        System.out.println("JSON object turn to List: " + list.get(0) + ", " + list.get(1));
    }

}

5.3 Spring Boot配置

直接建立一个Spring Boot项目,在项目创建时未加依赖,后期使用到Jackson的时候直接在pom.xml中添加fasterxml的相关依赖,有关Jackson的依赖可以在该链接进行复制:https://mvnrepository.com/artifact/com.fasterxml.jackson.core

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.10.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.10.0</version>
        </dependency>

 

相关标签: JSON Jackson