序列化和反序列化,objectMapper 详解

2024-08-30 17:12

本文主要是介绍序列化和反序列化,objectMapper 详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

序列化和反序列化,objectMapper 详解

    • 1、主要功能
    • 2、配置与自定义: 提供了一系列注解和配置方法,允许对序列化和反序列化过程进行高度定制。
    • 3、例子
      • 3.1. 简单的序列化与反序列化
      • 3.2. 使用注解自定义序列化和反序列化

ObjectMapper 是 Jackson 库中的核心类,用于在 Java 对象和 JSON 数据之间进行序列化(将 Java 对象转换为 JSON)和反序列化(将 JSON 转换为 Java 对象)。 ObjectMapper 提供了丰富的配置选项和功能,可以帮助开发者处理复杂的 JSON 数据结构。

1、主要功能

  • 序列化: 将 Java 对象转换为 JSON 字符串。
  • 反序列化: 将 JSON 字符串转换为 Java 对象。

2、配置与自定义: 提供了一系列注解和配置方法,允许对序列化和反序列化过程进行高度定制。

常用方法

  • writeValueAsString(Object value): 将 Java 对象序列化为 JSON 字符串。
  • readValue(String content, Class<T> valueType): 将 JSON 字符串反序列化为 Java 对象。
  • writeValue(File resultFile, Object value): 将 Java 对象序列化为 JSON 并写入文件。
  • readTree(String content): 将 JSON 字符串解析为 JsonNode 树,可以方便地进行树形结构操作。
  • configure(DeserializationFeature feature, boolean state): 配置反序列化特性,如是否允许未知属性等。
  • 常见的配置
	//创建ObjectMapper对象mapper = new ObjectMapper()//configure方法 配置一些需要的参数// 转换为格式化的json 显示出来的格式美化mapper.enable(SerializationFeature.INDENT_OUTPUT);//序列化的时候序列对象的那些属性  //JsonInclude.Include.NON_DEFAULT 属性为默认值不序列化 //JsonInclude.Include.ALWAYS      所有属性//JsonInclude.Include.NON_EMPTY   属性为 空(“”) 或者为 NULL 都不序列化 //JsonInclude.Include.NON_NULL    属性为NULL 不序列化mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);  //反序列化时,遇到未知属性会不会报错 //true - 遇到没有的属性就报错 false - 没有的属性不会管,不会报错mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);//如果是空对象的时候,不抛异常  mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);  // 忽略 transient 修饰的属性mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);//修改序列化后日期格式mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);  mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));//处理不同的时区偏移格式mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);mapper.registerModule(new JavaTimeModule());

3、例子

3.1. 简单的序列化与反序列化

import com.fasterxml.jackson.databind.ObjectMapper;public class Example {public static void main(String[] args) throws Exception {ObjectMapper objectMapper = new ObjectMapper();// 创建一个简单的 Java 对象User user = new User("John", 30);// 序列化:Java 对象 -> JSON 字符串String jsonString = objectMapper.writeValueAsString(user);System.out.println("Serialized JSON: " + jsonString);// 反序列化:JSON 字符串 -> Java 对象User deserializedUser = objectMapper.readValue(jsonString, User.class);System.out.println("Deserialized User: " + deserializedUser);}
}class User {private String name;private int age;// 构造函数、getters 和 setterspublic User() {}public User(String name, int age) {this.name = name;this.age = age;}// getter 和 setter@Overridepublic String toString() {return "User{name='" + name + "', age=" + age + "}";}
}

3.2. 使用注解自定义序列化和反序列化

通过 @JsonProperty 注解,可以指定 JSON 字段名与 Java 字段名之间的映射。

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;public class Example {public static void main(String[] args) throws Exception {ObjectMapper objectMapper = new ObjectMapper();// 创建带有自定义注解的 Java 对象Customer customer = new Customer("Alice", "New York");// 序列化String jsonString = objectMapper.writeValueAsString(customer);System.out.println("Serialized JSON: " + jsonString);// 反序列化Customer deserializedCustomer = objectMapper.readValue(jsonString, Customer.class);System.out.println("Deserialized Customer: " + deserializedCustomer);}
}class Customer {@JsonProperty("customer_name")private String name;@JsonProperty("customer_city")private String city;// 构造函数、getters 和 setterspublic Customer() {}public Customer(String name, String city) {this.name = name;this.city = city;}@Overridepublic String toString() {return "Customer{name='" + name + "', city='" + city + "'}";}
}

输出结果:

Serialized JSON: {"customer_name":"Alice","customer_city":"New York"}
Deserialized Customer: Customer{name='Alice', city='New York'}

ObjectMapper 是 Jackson 中非常强大的工具,提供了灵活且可配置的序列化和反序列化功能。通过注解和配置选项,开发者可以轻松处理复杂的 JSON 数据结构,并将其映射到 Java 对象中进行处理。

这篇关于序列化和反序列化,objectMapper 详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121433

相关文章

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现