文章目录
- 概念解释
- 1.Jaskson
- a.JSON
- JSON 的基本特点
- JSON 的基本结构
- JSON 示例
- b.ObjectMapper类
- 2.序列化与反序列化
- a.序列化
- 对象序列化
- 集合序列化
- List
- Set
- Map
- b.反序列化
- 反序列化单个对象
- 反序列化集合对象
概念解释
1.Jaskson
Jackson
是一个用于处理 JSON
数据的 Java
库,所以,在了解Jackson
之前,我们可以先来了解JSON
a.JSON
JSON(JavaScript Object Notation)
是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。JSON
是基于文本的格式,通常用于在客户端和服务器之间交换数据。
JSON 的基本特点
轻量级:JSON
格式简单,数据量小,适合网络传输。
易于阅读: JSON
的结构清晰,易于理解,便于调试。
语言无关: 虽然 JSON
源于 JavaScript
,但它被广泛支持于多种编程语言(如 Python
、Java
、C#
等)。
数据结构: JSON
支持基本的数据类型,如字符串、数字、布尔值、数组和对象。
JSON 的基本结构
JSON
数据由两种结构组成:
- 对象(
Object
):由大括号{}
包围,包含一组键值对。键(key
)是字符串,值(value
)可以是任意有效的JSON
数据类型。
{
"name": "Alice",
"age": 30,
"isStudent": false
}
数组(Array
): 由方括号 []
包围,包含一组值,值可以是任意有效的 JSON
数据类型。
[
"apple",
"banana",
"cherry"
]
JSON 示例
以下是一个包含不同类型的 JSON
数据的示例:
{
"name": "Alice",
"age": 30,
"isStudent": false,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
}
b.ObjectMapper类
ObjectMapper
类(com.fasterxml.jackson.databind.ObjectMapper
)是Jackson
的主要类,它可以帮助我们快速的进行各个类型和Json
类型的相互转换
2.序列化与反序列化
a.序列化
对象序列化
JSON
序列化是将Java
对象转换为JSON
字符串的过程。在JSON
序列化过程中,Java
对象的属性将被转换为JSON
对象的键值对,如果Java
对象包含其他Java
对象或集合,这些嵌套对象也会被转换为嵌套的JSON
对象和JSON
数组。
将Java
对象转换为JSON
字符串最基本的方法就是使用ObjectMapper
类的writeValueAsString
方法。这个方法接收一个Java
对象作为参数,返回一个JSON
字符串.
示例:
@Data
public class JacksonTest1 implements Serializable {
public String name;
public Integer age;
public JacksonTest1(String name, Integer age){
this.name=name;
this.age=age;
}
}
@Data
public class Test1 implements Serializable {
private String msg;
private Integer age;
private JacksonTest1 test;
public Test1(String msg, Integer age, JacksonTest1 test){
this.msg=msg;
this.age=age;
this.test=test;
}
}
@Slf4j
@SpringBootTest
public class JacksonTest {
@Test
void test(){
JacksonTest1 test=new JacksonTest1("zhangsan",11);
Test1 test1=new Test1("lisi",18,test);
ObjectMapper objectMapper=new ObjectMapper();
try {
String result=objectMapper.writeValueAsString(test1);
log.info(result);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
运行结果:
这里发现:
Test1对象的属性将被转换为JSON
对象的键值对,其中Jascson1
作为嵌套在Test1
内的对象,被转换为嵌套的JSON
对象
集合序列化
除了序列化单个Java
对象,Jackson
库还支持序列化Java
集合,包括List
、Set
和Map
等。可以使用ObjectMapper
类的writeValueAsString
方法将Java
集合序列化为JSON
字符串。
List
@Test
void jacksonTest2() throws JsonProcessingException {
ObjectMapper objectMapper=new ObjectMapper();
List<String> list=new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
System.out.println(objectMapper.writeValueAsString(list));
}
运行结果:
Set
@Test
void jacksonTest3() throws JsonProcessingException {
ObjectMapper objectMapper=new ObjectMapper();
Set<String> set=new HashSet<>();
set.add("张三");
set.add("李四");
set.add("王五");
set.add("张三");
System.out.println(objectMapper.writeValueAsString(set));
}
运行结果:
Map
@Test
void jacksonTest4() throws JsonProcessingException {
ObjectMapper objectMapper=new ObjectMapper();
Map<String,Integer> map=new HashMap<>();
map.put("zhansgan",14);
map.put("lisi",15);
map.put("wangwu",16);
map.put("zhaoliu",17);
System.out.println(objectMapper.writeValueAsString(map));
}
运行结果:
b.反序列化
反序列化单个对象
JSON
反序列化是将JSON
字符串转换为Java
对象的过程。在JSON
反序列化过程中,JSON
对象的键值对将被转换为Java
对象的属性,如果JSON
对象包含其他JSON
对象或JSON
数组,这些嵌套的JSON
也会被转换为嵌套的Java
对象和Java
集合。
将JSON
字符串转换为Java
对象的基本方法是使用ObjectMapper
类的readValue
方法。这个方法接收两个参数:一个JSON
字符串和一个Java
类,它会将JSON
字符串反序列化为指定的Java
类对象。
@Test
void jacksonTest1() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
CommonResult<String> commonResult = CommonResult.fail(500, "系统错误");
String str;
//序列化
str = objectMapper.writeValueAsString(commonResult);
log.info(str);
//反序列化
CommonResult<String> result= objectMapper.readValue(str,CommonResult.class);
System.out.println("code: "+result.getCode()+" errMsg: "+result.getErrMsg());
}
运行结果:
反序列化集合对象
除了反序列化单个Java
对象,Jackson
库还支持反序列化Java
集合,包括List
、Set
和Map
等。但是不可以直接使用ObjectMapper
类的readValue
方法将JSON
字符串反序列化为Java
集合,还需要搭配使用 TypeReference<T>
原因:
-
类型不明确:
readValue
方法在反序列化时需要明确目标类型。如果目标类型是一个通用的集合类型(如List
或Map
),而没有提供具体的实现类(如ArrayList
或HashMap
),则可能导致反序列化失败或产生不正确的结果。 -
类型擦除:在
Java
中,泛型是通过类型擦除实现的,这意味着在运行时,泛型类型的信息会丢失。这可能导致在反序列化时无法正确识别集合中元素的类型。 -
JSON格式问题:如果反序列化的数据格式与目标集合类型不匹配(例如,J
SON数
组与预期的集合类型不一致),也会导致反序列化失败。 -
库的限制:某些反序列化库可能对集合的处理有特定的要求,可能需要使用特定的方法或构造函数,而不是通用的
readValue
方法。
所以,正确的使用方法是::在调用 readValue
时,使用具体的集合类型。例如,可以使用 TypeReference
来指定具体的泛型类型:
List<MyClass> myList = objectMapper.readValue(jsonString, new TypeReference<List<MyClass>>() {});