【技术】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 {
    @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方法在反序列化时需要明确目标类型。如果目标类型是一个通用的集合类型(如 ListMap),而没有提供具体的实现类(如 ArrayListHashMap),则可能导致反序列化失败或产生不正确的结果。

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/889713.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue-插槽作用域实用场景

vue-插槽作用域实用场景 1.插槽1.1 自定义列表渲染1.2 数据表格组件1.3 树形组件1.4 表单验证组件1.5 无限滚动组件 1.插槽 插槽感觉知道有这个东西&#xff0c;但是挺少用过的&#xff0c;每次看到基本都会再去看一遍用法和概念。但是在项目里&#xff0c;自己还是没有用到过…

基于SpringBoot+Vue的疫情物资管理系统(带1w+文档)

基于SpringBootVue的疫情物资管理系统(带1w文档) 基于SpringBootVue的疫情物资管理系统(带1w文档) 本课题研究和开发疫情物资管理系统管理系统&#xff0c;让安装在计算机上的该系统变成管理人员的小帮手&#xff0c;提高疫情物资管理系统信息处理速度&#xff0c;规范疫情物资…

C++入门基础知识107—【关于C++continue 语句】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C continue 语句的相关内容&#xff01;…

关于Java部署项目,文件上传路径问题 、Windows是\ linux是/

Windows是\ linux是/ &#xff0c;踩坑。报错如下&#xff1a;

SpringBootWeb快速入门!详解如何创建一个简单的SpringBoot项目?

在现代Web开发中&#xff0c;SpringBoot以其简化的配置和快速的开发效率而受到广大开发者的青睐。本篇文章将带领你从零开始&#xff0c;搭建一个基于SpringBoot的简单Web应用~ 一、前提准备 想要创建一个SpringBoot项目&#xff0c;需要做如下准备&#xff1a; idea集成开发…

信息安全工程师(28)机房安全分析与防护

前言 机房安全分析与防护是一个复杂而细致的过程&#xff0c;涉及到物理安全、环境控制、电力供应、数据安全、设备管理、人员管理以及紧急预案等多个方面。 一、机房安全分析 1. 物理安全威胁 非法入侵&#xff1a;未经授权的人员可能通过门窗、通风口等进入机房&#xff0c;…

《大规模语言模型从理论到实践》第一轮学习笔记

第一章 绪论 本章主要介绍大规模语言模型基本概念、发展历程和构建流程。 大规模语言模型&#xff08;Large Language Models&#xff0c;LLM&#xff09;&#xff0c;也称大语言模型 或大型语言模型。 1.1 大规模语言模型基本概念 1.语言模型&#xff08;Language Model&a…

LeetCode 3310. 移除可疑的方法

LeetCode 3310. 移除可疑的方法 你正在维护一个项目&#xff0c;该项目有 n 个方法&#xff0c;编号从 0 到 n - 1。 给你两个整数 n 和 k&#xff0c;以及一个二维整数数组 invocations&#xff0c;其中 invocations[i] [ai, bi] 表示方法 ai 调用了方法 bi。 已知如果方法 k…

Leetcode 37. 解数独

1.题目基本信息 1.1.题目描述 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 33 宫内只能出现一次。&#xff08;请参考…

文件IO及目录操作

一、文件IO 1.1 close函数&#xff08;关闭文件&#xff09; #include <unistd.h>---所需头文件 int close(int fd); 功能&#xff1a;关闭文件 参数&#xff1a;fd&#xff1a;文件描述符 返回值&#xff1a;成功返回0&#xff0c;失败返回-1&#xff0c;置位错误码 …

主机加固的关键要素:服务器防病毒

在数字化浪潮中&#xff0c;网络安全已成为企业不可忽视的一环。尤其是安全运维人员&#xff0c;他们肩负着保护企业数据不受侵害的重任。MCK主机加固解决方案&#xff0c;正是为了应对这一挑战而生。 网络安全的严峻现实 不久前&#xff0c;一家知名企业因勒索病毒攻击而被迫…

二分查找一>0~n-1中缺失的数字(点名)

1.题目&#xff1a; 2.解析&#xff1a;方法一&#xff1a;用哈希表&#xff1a;记录存在的数字&#xff0c;找到哈希表为空的数字输出 Set<Integer> set new HashSet<>();for(int x : records) set.add(x);for(int i 0; i < set.size(); i){if(!set.contain…

Linux系列-Linux的常见指令

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” Linux基本指令 ls指令 语法&#xff1a;ls 【选项】【目录或文件】 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件&#xff0c;对于文件&#xf…

【GO基础学习】环境安装到基础语法(1)

文章目录 环境安装GoLand 安装GO基础GO特点类型和函数Init函数和main函数GO命令下划线变量和常量数组切片Slice 引用 环境安装 下载地址&#xff1a;https://www.golangroadmap.com/ 安装目录文件说明&#xff1a; api&#xff1a;每个版本的 api 变更差异。 bin&#xff1…

基于SpringBoot+Vue的船舶监造系统(带1w+文档)

基于SpringBootVue的船舶监造系统(带1w文档) 基于SpringBootVue的船舶监造系统(带1w文档) 大概在20世纪90年代&#xff0c;我国才开始研发船舶监造系统&#xff0c;与一些发达国家相比&#xff0c;系统研发起步比较晚。当时的计算机技术刚开始发展起来&#xff0c;国家经济力量…

Map的实现类:HashMap

在API获取HsahMap类的全部信息 实例代码&#xff1a;创建一个Student类和Demo02 package com.map;public class Student {private String name;private int stuNo;public Student(String name, int stuNo) {this.name name;this.stuNo stuNo;}public String getName() {retu…

从零开始构建:Python自定义脚本自动化你的日常任务

从零开始构建&#xff1a;Python自定义脚本自动化你的日常任务 Python 作为一种简洁且功能强大的编程语言&#xff0c;被广泛应用于各种自动化任务中。通过编写 Python 脚本&#xff0c;你可以轻松地将日常重复性工作自动化&#xff0c;例如文件操作、数据处理、网络爬虫、系统…

C++ | Leetcode C++题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; class Solution { public:bool circularArrayLoop(vector<int>& nums) {int n nums.size();auto next [&](int cur) {return ((cur nums[cur]) % n n) % n; // 保证返回值在 [0,n) 中};for (int i 0; i < n; i) {if …

STM32 407 RS485通信实现数据收发【我的创作纪念日】

1. 前言 本例中的485驱动&#xff0c;基于标准库编写&#xff0c;不是HAL库&#xff0c;请大家注意。 最近搞嵌入式程序&#xff0c;踩了不少坑&#xff0c;这里统一记录一下。 2. 收获 1.串口通信&#xff0c;数据是一个字节一个字节的发送&#xff0c;对方收到的数据是放在…

github学生认证(Github Copilot)

今天想配置一下Github Copilot&#xff0c;认证学生可以免费使用一年&#xff0c;认证过程中因为各种原因折腾了好久&#xff0c;记录一下解决方法供大家参考。 p.s.本文章只针对Github学生认证部分遇到的问题及解决方法&#xff0c;不包括配置copilot的全部流程~ 1、准备工作…