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

文章目录

  • 概念解释
    • 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.rhkb.cn/news/441191.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s实战-1

k8s实战-1 一、资源创建方式1.命令行2.yaml 二、命名空间三、Pod总结 一、资源创建方式 1.命令行 就是直接通过命令的方式创建&#xff0c;比如我要创建namespace&#xff0c; kubectl create namespace hello删除&#xff1a; kubectl delete -f hello2.yaml 简单来说&am…

用java编写飞机大战

游戏界面使用JFrame和JPanel构建。背景图通过BG类绘制。英雄机和敌机在界面上显示并移动。子弹从英雄机发射并在屏幕上移动。游戏有四种状态&#xff1a;READY、RUNNING、PAUSE、GAMEOVER。状态通过鼠标点击进行切换&#xff1a;点击开始游戏&#xff08;从READY变为RUNNING&am…

无人机单目+激光+IMU复杂弧形(隧道)退化场景SLAM技术详解

无人机在复杂弧形&#xff08;如隧道&#xff09;退化场景中的SLAM&#xff08;同时定位与地图构建&#xff09;技术&#xff0c;结合单目相机、激光雷达&#xff08;LiDAR&#xff09;和惯性测量单元&#xff08;IMU&#xff09;时&#xff0c;能够显著提升定位与建图的准确性…

在忘记密码的情况下重新访问手机?5种忘记密码解锁Android手机的方法

无需密码即可访问Android手机。 即使你忘记了密码&#xff0c;你也可以解锁你的Android手机&#xff0c;但你通常需要将手机恢复出厂设置。 您可以通过执行出厂恢复或使用“查找我的设备”网站解锁大多数Android手机。 如果你不再有密码&#xff0c;这里有五种解锁安卓手机的…

E37.【C语言】动态内存管理练习题

目录 1. 答案速查 分析 源代码分析 反汇编代码分析(底层) 2. 答案速查 分析 3. 答案速查 分析 VS逐步调试 1. 求下列代码的执行结果 #include <stdio.h> char* GetMemory(void) {char p[] "hello world";return p; }void Test(void) {char* str…

分层解耦-03.IOCDI-入门

一. IOC&DI入门 二.控制转移注解Component 因为dao和service接口的实现类对象需要传入到service和controller中&#xff0c;因此需要将dao和service代码加上Component注解&#xff0c;使之实现控制反转&#xff0c;将实现类对象交给IOC容器管理&#xff0c;成为IOC容器中…

Web安全 - 阶段性总结回顾_风险评估

文章目录 OWASP 2023 TOP 10用户数据的威胁评估密码盗窃XSS 漏洞SQL 注入CSRF 漏洞 资产数据的威胁评估SSRF 漏洞反序列化漏洞插件漏洞后门 认证和授权的安全防护检测与过滤加强认证补丁管理 进一步防护手段最小权限原则WAFIDS 小结 OWASP 2023 TOP 10 OWASP Top 10 概述 OWASP…

数据结构与算法——动态规划算法简析

1.初步了解动态规划 由于本篇博客属于动态规划的初阶学习&#xff0c;所以大多都是简单的表示&#xff0c;更深层次的学术用语会在之后深度学习动态规划之后出现&#xff0c;本文主要是带各位了解一下动态规划的大致框架 1.1状态表示 通常的我们会开辟一个dp数组来存储需要表示…

C++ WebDriver扩展

概述 WebDriver协议基于HTTP&#xff0c;使用JSON进行数据传输&#xff0c;定义了client与driver之间的通信标准。无论client的实现语言&#xff08;如Java或C#&#xff09;&#xff0c;都能通过协议中的endpoints准确指示driver执行各种操作&#xff0c;覆盖了Selenium的所有功…

【C语言】预处理指令详解

目录 一、预定义符号 二、#define 定义常量 三、#define 定义宏 &#xff08;1&#xff09;宏定义的使用 &#xff08;2&#xff09;带副作用的宏参数 &#xff08;3&#xff09;宏替换的规则 &#xff08;4&#xff09;宏与函数对比 &#xff08;5&#xff09;#和## …

基于单片机的书库环境监测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DHT11湿度传感器检测湿度&#xff0c;DS18B20温度传感器检测温度&#xff0c; 采用滑动变阻器连接数模转换器模拟二氧化碳和氧气浓度检测&#xff0c;各项数值通过lc…

SQL第12课——联结表

三点&#xff1a;什么是联结&#xff1f;为什么使用联结&#xff1f;如何编写使用联结的select语句 12.1 联结 SQL最强大的功能之一就是能在数据查询的执行中联结&#xff08;join)表。联结是利用SQL的select能执行的最重要的操作。 在使用联结前&#xff0c;需要了解关系表…

免费高可用软件

高可用软件是指那些能够提供高可用性、高可靠性的软件&#xff0c;它们在各种应用场景下都能确保系统的稳定运行。以下是四款免费的高可用软件&#xff0c;它们在不同领域都表现出色&#xff0c;能够满足各种高可用性需求。 一、PanguHA PanguHA是一款专为Windows平台设计的双…

使用正则表达式删除文本的奇数行或者偶数行

用智谱清言和kimi搜出来的结果都没法在notepad生效&#xff0c;后面在overflow上找到的答案比较靠谱。 查找&#xff1a;^[^\n]*\n([^\n]*) 替换&#xff1a;\1 删除偶数行 查找&#xff1a;^([^\n]*)\n[^\n]* 替换&#xff1a;\1 代码解释 ^&#xff1a;这个符号代表字符…

RabbitMQ 集群

文章目录 集群搭建使用 Docker-Compose 镜像队列搭建步骤工作原理镜像策略主从同步 同步延迟 集群搭建 参考&#xff1a; docker中安装并启动rabbitMQ Docker中搭建RabbitMQ集群 使用 Docker-Compose 这里提供一个脚本来使用 docker-compose 完成RabbitMQ集群的配置及启动…

机器学习-树模型算法

机器学习-树模型算法 一、Bagging1.1 RF1.2 ET 二、Boosting2.1 GBDT2.2 XGB2.3 LGBM 仅个人笔记使用&#xff0c;感谢点赞关注 一、Bagging 1.1 RF 1.2 ET 二、Boosting 2.1 GBDT 2.2 XGB 2.3 LGBM LightGBM&#xff08;Light Gradient Boosting Machine) 基本算法原理…

基于单片机的烧水壶系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC单片机&#xff0c;采用四个按键&#xff0c;通过DS18B20检测温度&#xff0c;开机显示实时温度 第一个按键为切换功能按键&#xff0c;按下后&#xff0c;可以设置烧水温度的大小&…

五子棋双人对战项目(6)——对战模块(解读代码)

目录 一、约定前后端交互接口的参数 1、房间准备就绪 &#xff08;1&#xff09;配置 websocket 连接路径 &#xff08;2&#xff09;构造 游戏就绪 的 响应对象 2、“落子” 的请求和响应 &#xff08;1&#xff09;“落子” 请求对象 &#xff08;2&#xff09;“落子…

【Git】vscode链接github拉去镜像

1.拉取别人的项目到自己的仓库 2.回到自己的仓库拉取文件到vscode里面下载 使用vscode进入虚拟机 推送到自己的仓库上面 在 github 页面将修改的内容 PR 到 Tutorial 创建一个个人仓库 代码如下 cd demo git clone https://github.com/3154067760/Tutorial.git cd Tutorial/…

UGUI(三大现成UI控件)

Rawimage 可以是任意类型的图&#xff0c;所以这里的泛型就更宽泛&#xff0c;不止sprite 相比Image唯二的不同 uvrect有点像平铺 Text suddenly come to a Free island. best fit开启后会有范围选择 Image image 组件是挂在RectTransform的ui下的&#xff0c;换句话说&…