【技术】Jaskson的序列化与反序列化

news/2024/10/11 19:18:51/

文章目录

  • 概念解释
    • 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,但它被广泛支持于多种编程语言(如 PythonJavaC# 等)。
数据结构: 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方法在反序列化时需要明确目标类型。如果目标类型是一个通用的集合类型(如 ListMap),而没有提供具体的实现类(如 ArrayListHashMap),则可能导致反序列化失败或产生不正确的结果。

  • 类型擦除:在 Java 中,泛型是通过类型擦除实现的,这意味着在运行时,泛型类型的信息会丢失。这可能导致在反序列化时无法正确识别集合中元素的类型

  • JSON格式问题:如果反序列化的数据格式与目标集合类型不匹配(例如,JSON数组与预期的集合类型不一致),也会导致反序列化失败

  • 库的限制:某些反序列化库可能对集合的处理有特定的要求,可能需要使用特定的方法或构造函数,而不是通用的 readValue 方法。

所以,正确的使用方法是::在调用 readValue 时,使用具体的集合类型。例如,可以使用 TypeReference 来指定具体的泛型类型
List<MyClass> myList = objectMapper.readValue(jsonString, new TypeReference<List<MyClass>>() {});


http://www.ppmy.cn/news/1537590.html

相关文章

第二阶段:mysql(学完就隐藏版)

第一章&#xff1a;部署数据库系统&#xff08;注意关闭防火墙&#xff0c;selinux安装&#xff09; 安装mysql配置的相关文件&#xff1a;yum install https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm&#xff08;centos9&#xff1a;yum install http…

k8s-集群部署1

k8s-集群部署1 一、基础环境准备二、docker环境准备三、k8s集群部署1.kubeadm创建集群2.使用kubeadm引导集群 总结 一、基础环境准备 首先&#xff0c;需要准备三个服务器实例&#xff0c;这里我使用了阿里云创建了三个实例&#xff0c;如果不想花钱&#xff0c;也可以在VM上创…

pytorh学习笔记——波士顿房价预测

机器学习的“hello world”&#xff1a;波士顿房价预测 波士顿房价预测的背景不用提了&#xff0c;简单了解一下数据集的结构。 波士顿房价的数据集&#xff0c;共有506组数据&#xff0c;每组数据共14项&#xff0c;前13项是影响房价的各种因素&#xff0c;比如&…

v-html里面的标签设置样式没有用怎么办?

v-html里面的标签设置样式没有用是因为style里面设置了scoped&#xff0c;html绑定渲染出的内容可以理解为是子组件的内容&#xff0c;子组件不会被加上对应的属性&#xff0c;所以不会应用css 解决有两种方法&#xff1a; 1.一种是把scoped属性去掉就行了 2.另外一种方法利…

Go 操作 redis

前提 安装 redis 第三方库&#xff0c;参考go安装三方库 编程示例 写入读取操作字符串 代码 package mainimport ("fmt""github.com/gomodule/redigo/redis" )func main() {conn, err : redis.Dial("tcp", "127.0.0.1:6379")if e…

【中文版】深度学习 deep learning 花书 pdf下载 2017.09.04

中文版pdf&#xff1a;https://pan.baidu.com/s/1s93yluQGSly5uBDAIVAlNg?pwdx6xy github&#xff1a;https://github.com/exacity/deeplearningbook-chinese 目录 第一章 前言第二章 线性代数第三章 概率与信息论第四章 数值计算第五章 机器学习基础第六章 深度前馈网络第七…

电动牙刷拆解学习

大厂量产的产品的寻片选型为自己设计硬件的时候芯片选型提供了参考&#xff1a; 采用这个触点的方式充电相比于tppeC来说可以很好起到防水作用&#xff1a; USB公头&#xff1a; 牙刷母头&#xff1a; 电池充电芯片来自英集芯&#xff0c;型号IP2326&#xff0c;是一颗内部集…

初识算法 · 双指针(3)

目录 前言&#xff1a; 和为s的两数之和 题目解析&#xff1a; ​编辑 算法原理&#xff1a; 算法编写&#xff1a; 三数之和 题目解析 算法原理 算法编写 前言&#xff1a; 本文通过介绍和为S的两数之和&#xff0c;以及三数之和&#xff0c;对双指针算法进行深一步…