jackson序列化(jackson codec)

news2024/11/15 4:43:58

Jackson 是一个用于 Java 平台的开源 JSON 库,它提供了灵活且高效的方式来处理 JSON 数据的序列化(Java对象 → JSON字符串)和反序列化(JSON 字符串→ Java对象)。

以下是 Jackson 的一些主要特点和功能:

  1. 高性能:Jackson 通过使用基于流的处理模型和性能优化技术,提供了出色的性能。它支持快速的数据绑定和处理大型 JSON 数据。

  2. 灵活性:Jackson 支持多种数据格式,包括 JSON、Smile(二进制 JSON 格式)和 XML。它可以处理复杂的对象关系和嵌套结构,并支持自定义序列化和反序列化规则。

  3. 注解支持:Jackson 提供了一系列注解(如 @JsonProperty@JsonIgnore@JsonFormat 等)来控制序列化和反序列化的行为。通过注解,你可以指定字段名称、忽略特定字段、格式化日期和时间等。

  4. 支持泛型和多态:Jackson 支持序列化和反序列化泛型类型,以及处理多态类型的对象。它提供了类型擦除解决方案和多态类型的标记(如 @JsonTypeInfo@JsonSubTypes 等)。

  5. 可定制性:Jackson 提供了丰富的配置选项和可扩展的 API,使你能够根据需求进行定制。你可以自定义序列化器和反序列化器,注册模块扩展功能,以及处理特定的数据转换和验证逻辑。

  6. 整合性:Jackson 可以与各种 Java 框架和库进行无缝集成,如 Spring、Hibernate、JAX-RS 等。它可以轻松地与其他库一起使用,以提供全面的数据处理解决方案。

Spring MVC 默认使用 Jackson 库进行 JSON 的序列化和反序列化,无需额外的配置。

当你返回一个对象时,Spring MVC 将自动使用 Jackson 库将该对象序列化为 JSON 字符串,并将其作为响应的主体返回给客户端。

同样地,当你使用 @RequestBody 注解标记的方法参数时,Spring MVC 将使用 Jackson 库将请求体中的 JSON 数据反序列化为对应的 Java 对象。

SpringBoot项目自动依赖了 Jackson 库。 非SpringBoot项目,使用 Jackson 库,可能需要在项目中添加 Jackson 库依赖。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.5</version>
</dependency>
View Code

下面是一个使用 Jackson 库进行对象序列化和反序列化的示例

package jstudy.jackson;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

/**
 * 使用 Jackson 库进行对象序列化和反序列化的示例类
 */
public class JacksonSerializationDemo {

    public static void main(String[] args) {
        // 创建一个 ObjectMapper 对象
        ObjectMapper objectMapper = new ObjectMapper();

        // 创建一个示例对象
        Person person = new Person("John Doe", 30);

        try {
            // 对象序列化为 JSON 字符串
            String json = objectMapper.writeValueAsString(person);
            System.out.println("Serialized JSON: " + json);

            // JSON 字符串反序列化为对象
            Person deserializedPerson = objectMapper.readValue(json, Person.class);
            System.out.println("Deserialized Person: " + deserializedPerson);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

    @Data
    static class Person {
        private String name;
        private Integer age;
        private String address;

        // 必须提供默认构造函数,以便 Jackson 库能够实例化对象
        public Person() {
        }

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

    }
}

代码运行结果:

Serialized JSON: {"name":"John Doe","age":30,"address":null}
Deserialized Person: JacksonSerializationDemo.Person(name=John Doe, age=30, address=null)

BTW,上面示例类  JacksonSerializationDemo 可以rename为 JacksonCodecDemo

"Codec" 一词通常用于指代编码器-解码器(Encoder-Decoder)或编码-解码(Encode-Decode)的概念。将示例重命名为 "JacksonCodecDemo" 可以更准确地表达其涵盖了序列化和反序列化的功能。

通过将示例命名为 "JacksonCodecDemo",强调了 Jackson 库不仅实现了对象到 JSON 的序列化(即编码)功能,还具备将 JSON 转换回对象的反序列化(即解码)功能。

这种重命名方式能够更清晰地传达代码示例的目的。

日常开发中,我们也要关注命名。良好的命名规范是高质量代码的基石之一。在 Java 中,命名规范不仅帮助保持代码的整洁性和一致性,还能极大地提高代码的可读性和可维护性。

如何控制 Jackson 在序列化对象时不包含全是 null 的字段?

要在 Jackson 中避免序列化全是 null 的字段,你可以使用 Jackson 的配置选项来控制序列化行为。

以下是两种常用的方法:

1. 使用 ObjectMapper 的 setSerializationInclusion 方法设置序列化包含规则为 JsonInclude.Include.NON_NULL。这意味着只有非空字段才会被序列化,而全是 null 的字段将被忽略。

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonSerializationDemo {

    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        // ... 省略其他代码 ...
    }
}

2. 使用 @JsonInclude 注解在类级别设置序列化包含规则为 JsonInclude.Include.NON_NULL。这将仅对被注解的类有效。

import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Person {
    // ... 省略其他代码 ...
}
BTW,我司系统是前后端分离模式,为提高开发效率,我们约定给前端页面所提供的后端接口,只返回明确需要的字段。例如:企业客户信息,后端有一个 EnterpriseVO,包含了企业的基本信息和资质信息。不过,查询企业客户基本信息API、查询企业客户资质信息API,不能返回 EnterpriseVO 的所有字段。此时,要满足这个就可以用上面的 Jackson不序列化null字段的方式来解决。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu安装QQ教程

Ubuntu安装QQ教程 腾讯更新Linux版的QQ&#xff0c;这里安装一下&#xff1b; 首先&#xff0c;进入官网找到合适对应的安装包&#xff1b; QQLinux版本官网&#xff1a;https://im.qq.com/linuxqq/index.shtml 我们是ubuntu系统选择X86下的deb版本&#xff0c;如果是arm开…

TikTok养号的网络环境及相关代理IP知识

TikTok作为一个流行的短视频分享平台&#xff0c;其用户量非常庞大&#xff0c;很多商家和个人都会使用TikTok来进行引流和推广。由于TikTok的规则和政策限制了每个用户每天发布视频的数量&#xff0c;因此许多用户会使用多个账号来发布更多的视频以提高曝光率。 然而&#xff…

Android Studio Build窗口出现中文乱码问题

刚安装成功的android studio软件打开工程&#xff0c;编译时下方build窗口中中文是乱码。 解决&#xff1a; 可点击studio状态栏的Help—>Edit Custom VM Options &#xff0c;在打开的studio64.exe.vmoptions文件后面添加&#xff1a;(要注意不能有空格&#xff0c;否则st…

FL Studio Producer Edition 21.2.3.4004中文直版及FL Studio 204如何激活详细教程

在数字化音乐制作的浪潮中&#xff0c;FL Studio 24.1.1.4234的发布无疑又掀起了一股新的热潮。这款由Image-Line公司开发的数字音频工作站&#xff08;DAW&#xff09;软件&#xff0c;以其强大的功能和易用的界面&#xff0c;赢得了全球无数音乐制作人的青睐。本文将深入探讨…

python 图片转文字、语音转文字、文字转语音保存音频并朗读

一、python图片转文字 1、引言 pytesseract是基于Python的OCR工具&#xff0c; 底层使用的是Google的Tesseract-OCR 引擎&#xff0c;支持识别图片中的文字&#xff0c;支持jpeg, png, gif, bmp, tiff等图片格式 2、环境配置 python3.6PIL库安装Google Tesseract OCR 3、安…

使用axios请求后端的上传图片接口

安装axios npm install axios 创建input文件上传标签 <input type"file" name"" id"" change"handleChange" /> 使用axios请求后端的图片上传接口 function handleChange(val) {// new FormData() js内置构造函数&#xff0c…

C++入门基础:C++中的常用操作符练习

开头介绍下C语言先&#xff0c;C是一种广泛使用的计算机程序设计语言&#xff0c;起源于20世纪80年代&#xff0c;由比雅尼斯特劳斯特鲁普在贝尔实验室开发。它是C语言的扩展&#xff0c;增加了面向对象编程的特性。C的应用场景广泛&#xff0c;包括系统软件、游戏开发、嵌入式…

【Nginx】Mac电脑安装nginx

使用brew安装nginx brew install nginx查看nginx信息 brew info nginx启动nginx brew services start nginx验证是否启动成功 浏览器输入地址&#xff1a;127.0.0.1:8080 停止服务 brew services stop nginx进入nginx文件目录 cd /opt/homebrew/etc/nginx重启服务 bre…

轻量化YOLOv7系列:结合G-GhostNet | 适配GPU,华为诺亚提出G-Ghost方案升级GhostNet

轻量化YOLOv7系列&#xff1a;结合G-GhostNet | 适配GPU&#xff0c;华为诺亚提出G-Ghost方案升级GhostNet 需要修改的代码models/GGhostRegNet.py代码 创建yaml文件测试是否创建成功 本文提供了改进 YOLOv7注意力系列包含不同的注意力机制以及多种加入方式&#xff0c;在本文…

分布式光伏并网AM5SE-IS防孤岛保护装置介绍——安科瑞 叶西平

产品简介 功能&#xff1a; AM5SE-IS防孤岛保护装置主要适用于35kV、10kV及低压380V光伏发电、燃气发电等新能源并网供电系统。当发生孤岛现象时&#xff0c;可以快速切除并网点&#xff0c;使本站与电网侧快速脱离&#xff0c;保证整个电站和相关维护人员的生命安全。 应用…

【简历】吉林某一本大学:JAVA秋招简历指导,简历通过率比较低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份吉林某一本大学25届计算机专业同学的Java简历。因为学校是一本&#xff0c;所以求职目标以中厂为主。因为学校背景在中厂是正常…

基于Jeecgboot3.6.3的vue3版本前后端分离的流程管理平台

声明一下&#xff1a;因为这个项目license问题无法开源&#xff0c;更多技术支持与服务联系本人或加入我的知识星球提供一些技术服务。 初步完成了基于jeecgboot3.6.3的vue3版本的前后端流程管理平台&#xff0c;基于flowable6.8.1&#xff0c;同时支持bpmn流程设计器与仿钉钉流…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十一章 添加设备树节点

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

利用Django和Ansible实现自动化部署

在软件开发的快节奏世界中&#xff0c;自动化部署是提高开发效率和确保软件质量的关键。Django是一个功能强大的Python Web框架&#xff0c;它允许开发者快速构建安全、可扩展的Web应用。Ansible则是一个简单且强大的自动化工具&#xff0c;它可以用于配置系统、部署软件以及执…

通信原理思科实验四:静态路由项配置实验

实验四 静态路由项配置实验 一&#xff1a;实验内容 二&#xff1a;实验目的 三、实验原理 四、实验步骤 选择三个2811型号的路由器 R1、R2、R3 路由器默认只有两个快速以太网接口&#xff0c;为路由器R1和R3增加快速以太网接口模块NM-1FE-TX&#xff0c;安装后检查路由器的接…

一番赏小程序搭建,线上一番赏市场

一番赏作为一个经久不衰的潮流市场&#xff0c;一直流行于消费者市场中。一番赏商品拥有不同系列&#xff0c;涵盖了热门动漫、漫画、影视等主题&#xff0c;商品包含了手办等周边商品&#xff0c;具有非常大的收藏价值。相比于其他潮玩模式&#xff0c;一番赏的性价比更高&…

Mindspore框架循环神经网络RNN模型实现情感分类|(四)损失函数与优化器

Mindspore框架循环神经网络RNN模型实现情感分类 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;一&#xff09;IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;二&#xff09;预训练词向量 Mindspore框架循环神经网络RNN模型实现…

DASCTF-BabyAndroid

一个apk文件 下载下运行不出来 题目有提示 这是截取的信息 第一次写,我就按照大佬的wp思路来 首先我们确定 Host: yuanshen.com 这个信息 jeb打开,搜索 成功锁定到有价值的信息 protected String doInBackground(String[] params) {String contentText params[0];try {…

day20算法

一、算法的相关概念 程序 数据结构 算法 算法是程序设计的灵魂&#xff0c;结构是程序设计的肉体 算法&#xff1a;计算机解决问题的方法或步骤 1.1 算法的特性 1> 确定性&#xff1a;算法中每一条语句都有确定的含义&#xff0c;不能模棱两可 2> 有穷性&#xf…

ModuleNotFoundError: No module named ‘scrapy.utils.reqser‘

在scrapy中使用scrapy-rabbitmq-scheduler会出现报错 ModuleNotFoundError: No module named scrapy.utils.reqser原因是新的版本的scrapy已经摒弃了该方法,但是scrapy-rabbitmq-scheduler 没有及时的更新,所以此时有两种解决方法 方法一.将scrapy回退至旧版本,找到对应的旧版…