JSON学习(二)—— 简单实战篇(使用Jackson实现Java对象、数组与JSON的互相转换)
一、前言
之前简单的了解了一下JSON的一些类似JSON是个啥,为什么要有JSON,JSON与XML的区别,JSON的语法规则等基础概念(可跳转学习笔记:https://blog.csdn.net/qq_38586378/article/details/102989550),想着后端尤其在Java Web项目中的话应该是要学会Java与JSON的相互转换的,恰好之前毕设的时候又遇到过这个技术点,就是Jackson,就简单的做了个小demo进行记录。
二、参考链接
- https://blog.csdn.net/u011054333/article/details/80504154
- https://www.cnblogs.com/naaoveGIS/p/3893651.html
- https://www.jianshu.com/p/4bd355715419
- https://www.yiibai.com/jackson
三、知识点及技术的简单介绍
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一下)。
四、实现过程
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 构造体实现对象实例化)
4.2 测试
4.2.1 Java对象转JSON对象
通过new Student实例化Student对象,使用ObjectMapper对象的
writeValueAsString()方法实现将Java对象转为JSON并输入。
输出结果为:
4.2.2 JSON对象转Java对象
在讲JSON对象转为Java对象的时候需要注意,如果单纯使用ObjectMapper的readValue方法,结果会报错如下
解决方法是在创建好的实体类的构造方法前加@JsonCreator注释,并在构造方法的参数中添加@JsonProperty注释
如此即可解决该问题,JSON转Java对象的方法如下图
结果如下:
4.2.3 数组转JSON对象
和Java对象转JSO类似,直接上图,将创建好的List对象以JSON格式输出
4.2.4 JSON对象转数组
此处需要注意,ObjectMapper的readValue方法中的第二参数应该为New TypeReference<T>() {},见下图 注意此处的TypeRerence是引用的
com.fasterxml.jackson.core.type.TypeReference
4.2.3与4.2.4结果图如下
4.2.5 如果Java对象实例化的时候有空值,JSON直接输出null(构造函数中去掉stuParents属性)
4.2.6 如果想输出忽略掉null值,可在实体类前面加@JsonInclue(JsonInclude.Include.Type)注释,其中Type有NON_NULL、NON_ABSENT、NON_DEFAULT、NON_EMPTY,其中NON_EMPTY指输出忽略为空的字符串。
使用NON_NULL输出4.2.5结果,可以看到输出Json已经忽略掉了值为null的stuParents
再如使用NON_EMPTY,并且恢复输出stuParents,单纯给这个Map对象初始化但是不赋值,结果输出如下,转为JSON忽略为空的stuParents 需要注意null并不等同于为空,为空是指值为空,null是根本就没有这个对象(于JSON与Java转换而言)
五、总结
通过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>
上一篇: jsonson GetStarted