文章目录
- 概念解释
- 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 {@Testvoid 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
@Testvoid 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
@Testvoid 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
@Testvoid 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
类对象。
@Testvoid 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>>() {});