在java中怎么把对象转换成json,可以使用jackson

在这里插入图片描述

简述

在Spring Boot应用中,将Java对象转换为JSON字符串通常有两种主要方法:使用Jackson库或使用Gson库。由于Spring Boot默认集成了Jackson库,所以我们将重点介绍如何使用Jackson来进行对象到JSON的转换。

第1步:Maven添加依赖

        <!--json序列化--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.4.2</version></dependency>

第2步:引用

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

第3步:测试代码

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestController
@RequestMapping("/api/Books")
public class BookController {public ApiResult index() throws JsonProcessingException {ApiResult res= new ApiResult(CodeEnum.SUCCESS,"成功",1); Logger logger = LoggerFactory.getLogger(BookController.class);ObjectMapper objectMapper = new ObjectMapper();// 将对象转换为 JSON 字符串String jsonString = objectMapper.writeValueAsString(res);// 将 JSON 字符串转换为 Java 对象ApiResult jsonApiResult= objectMapper.readValue(jsonString, ApiResult.class);logger.warn(jsonString);logger.error(jsonString);logger.debug(jsonString);}
} 

了解slf4j日志请看文章【java】Springboot框架增加日志功能,使用log4j和Logback实现日志功能


延伸阅读:jackson-databind和jackson-module-jaxb-annotations的区别

jackson-module-jaxb-annotationsjackson-databindJackson 生态系统中的两个组件,它们分别服务于不同的目的。下面详细介绍这两个库的区别和用途:

jackson-databind

jackson-databind 是 Jackson 库的核心组件之一,提供了将 Java 对象与 JSON 数据相互转换的能力。
它基于 jackson-core 提供的基础流 API,增加了更高层次的抽象,使得序列化和反序列化变得更加简便。

主要功能

  • 序列化:将 Java 对象转换为 JSON 字符串。
  • 反序列化:将 JSON 字符串转换为 Java 对象。
  • 支持 POJOs:主要针对普通的 Java 对象(POJOs)进行序列化和反序列化。
  • 提供 ObjectMapper 类:这是 jackson-databind 中最重要的类,它提供了丰富的 API 来处理序列化和反序列化任务。
import com.fasterxml.jackson.databind.ObjectMapper;public class Main {public static void main(String[] args) {ObjectMapper objectMapper = new ObjectMapper();// 示例对象Person person = new Person("John Doe", 30);try {// 将对象转换为 JSON 字符串String jsonString = objectMapper.writeValueAsString(person);System.out.println(jsonString);// 将 JSON 字符串转换为对象String jsonInput = "{\"name\":\"Jane Doe\",\"age\":25}";Person deserializedPerson = objectMapper.readValue(jsonInput, Person.class);System.out.println(deserializedPerson.getName());} catch (Exception e) {e.printStackTrace();}}
}class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}// Getter and Setterpublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

jackson-module-jaxb-annotations

jackson-module-jaxb-annotations 是 Jackson 的一个模块,它支持 JAXB(Java Architecture for XML Binding)注解来控制序列化和反序列化的行为。JAXB 注解允许你更细粒度地控制序列化过程,特别是当你需要处理复杂的 XML 结构时。

主要功能

  • 支持 JAXB 注解:使用 javax.xml.bind.annotation.* 系列注解来标注 Java 类,从而控制序列化和反序列化的过程。
  • 处理复杂数据类型:更适合处理具有复杂结构的对象,例如具有嵌套对象、数组或集合的类。
  • 与现有 JAXB 类型的兼容性:如果你已经在使用 JAXB,那么可以继续使用相同的注解来与 Jackson 配合使用。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;public class Main {public static void main(String[] args) {// 创建 ObjectMapper 并注册 JaxbAnnotationModuleObjectMapper xmlMapper = new XmlMapper();xmlMapper.registerModule(new JaxbAnnotationModule());try {// 示例对象Person person = new Person();person.setName("John Doe");person.setAge(30);// 将对象转换为 XML 字符串String xmlString = xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(person);System.out.println(xmlString);// 将 XML 字符串转换为对象String xmlInput = "<person><name>John Doe</name><age>30</age></person>";Person deserializedPerson = xmlMapper.readValue(xmlInput, Person.class);System.out.println(deserializedPerson.getName());} catch (Exception e) {e.printStackTrace();}}
}import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name = "person")
class Person {private String name;private int age;// Getter and Setter@XmlElement(name = "name")public String getName() {return name;}public void setName(String name) {this.name = name;}@XmlElement(name = "age")public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

总结

  • jackson-databind:适用于大多数日常的 JSON 序列化和反序列化任务,特别是对于简单的 POJOs。
  • jackson-module-jaxb-annotations:如果你需要更细粒度地控制序列化和反序列化过程,或者需要处理复杂的 XML 结构,可以选择使用 jackson-module-jaxb-annotations。

在大多数情况下,jackson-databind 已经足够满足大多数 JSON 处理的需求。
如果你有特定的需求,
比如需要使用 JAXB 注解,或者需要处理 XML 数据,那么jackson-module-jaxb-annotations可能会更有用。

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

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

相关文章

STM32 Modbus主从站实例程序-FreeRTOS

资料下载地址&#xff1a;STM32 Modbus主从站实例程序-FreeRTOS​​​​​​​ 基本设置 启用Freertos,添加任务 设置中断优先级 设置长生成MDK工程 工程里面添加Modbus库 修改main.c 修改freertos.c 编译下载到单片机,完美运行

深入解析 helpTransfer 方法:多线程协作中的哈希表扩容

文章目录 什么是哈希表哈希表的问题&#xff1a;扩容扩容的挑战扩容的原理helpTransfer 方法检查是否正在扩容生成扩容标记并检查条件判断是否需要更多线程帮助加入搬家工作返回新表或旧表 什么是哈希表 哈希表&#xff08;HashMap&#xff09;是一种常用的数据结构&#xff0…

熬夜2月,终成人人可自建的AI网站

一、前言 自小码哥AI上线以来&#xff0c;备受粉丝们的关注&#xff0c;拖更了两个月&#xff0c;每日加班加点研发系统&#xff0c;2.0终于上线了。 作为一名年过三十的程序员&#xff0c;我深刻体会到了职场的残酷和不确定性&#xff0c;特别是这两年&#xff0c;经济不景气…

ROS理论与实践学习笔记——2 ROS通信机制之服务通信

服务通信也是ROS中一种极其常用的通信模式&#xff0c;服务通信是基于请求响应模式的&#xff0c;是一种应答机制。也即: 一个节点A向另一个节点B发送请求&#xff0c;B接收处理请求并产生响应结果返回给A&#xff0c;用于偶然的、对时时性有要求、有一定逻辑处理需求的数据传输…

基于Java语言的桩底层直连协议和云快充协议

‌云快充协议‌是一种标准通信协议&#xff0c;主要用于电动车与充电桩之间的数据交换。该协议包含了充电请求、状态查询、支付等多个功能模块&#xff0c;这些功能的实现不仅需要对协议进行深入理解&#xff0c;还需要编写相应的代码进行封装。云快充协议旨在解决市场上快充标…

【C++前缀和 状态压缩】1177. 构建回文串检测|1848

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 位运算、状态压缩、枚举子集汇总 LeetCode 1177. 构建回文串检测 难度分&#xff1a;1848 给你一个字符串 s&#xff0c;请你对 s 的子串进行检测。 每次检测&#x…

Python OpenCV精讲系列 - 基于深度学习的目标检测(十二)

&#x1f496;&#x1f496;⚡️⚡️专栏&#xff1a;Python OpenCV精讲⚡️⚡️&#x1f496;&#x1f496; 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计&#xff0c;从基础概念入手&#xff0c;逐步深入到图像处理、特征检测、物体识…

C++ | Leetcode C++题解之第434题字符串中的单词数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countSegments(string s) {int segmentCount 0;for (int i 0; i < s.size(); i) {if ((i 0 || s[i - 1] ) && s[i] ! ) {segmentCount;}}return segmentCount;} };

await命令使用注意点

第一点&#xff0c;前面已经说过&#xff0c;await 命令后面的 Promise 对象&#xff0c;运行结果可能是 rejected&#xff0c;所以最好把 await 命令放在 try...catch 代码块中 第二点&#xff0c;多个 await 命令后面的异步操作&#xff0c;如果不存在继发关系&#xff0c;最…

最优化理论与自动驾驶(二-补充):求解算法(梯度下降法、牛顿法、高斯牛顿法以及LM法,C++代码)

在之前的章节里面&#xff08;最优化理论与自动驾驶&#xff08;二&#xff09;&#xff1a;求解算法&#xff09;我们展示了最优化理论的基础求解算法&#xff0c;包括高斯-牛顿法&#xff08;Gauss-Newton Method&#xff09;、梯度下降法&#xff08;Gradient Descent Metho…

FileLink跨网文件传输 | 跨越网络边界的利器,文件传输不再受限

在当今数字化时代&#xff0c;企业与个人对文件传输的需求不断增长&#xff0c;尤其是在跨网环境中。传统的文件传输方式常常受到网络带宽、传输速度和安全性的限制&#xff0c;给用户带来了诸多不便。FileLink 的出现&#xff0c;为这一难题提供了完美解决方案&#xff0c;让文…

Python 聊聊有内置函数,又该怎么学习内置函数

前言 python有内置函数的概念&#xff0c;从Python3.x开始&#xff0c;内置函数位于builtins模块&#xff0c;比如我们常用的内置函数len()&#xff0c;其实它是builtins模块下的属性&#xff0c;我们也可以builtins.len&#xff08;&#xff09;去访问&#xff0c;当然因为每个…

鼎曼白茶贡眉:贮留芳香记忆,书写老茶传奇

在茶的世界 每一叶都承载着岁月的印记 每一香都凝聚着时光的韵味 其中 有一种温润如玉、恬淡从容的存在 它便是2017年贡眉 这款经过七年时光沉淀与陈化的白茶 以其独特的韵味与品质 吸引了无数茶客的青睐 今日 让我们一同领略2017年贡眉的魅力 PART 01 FIRST OF ALL …

力扣【118-杨辉三角】【数组-C语言】

题目&#xff1a;力扣-118 杨辉三角&#xff1a;&#xff08;算法思路&#xff09; 1. 每行第一个数和最后一个数都是1 2. 把杨辉三角左端对齐&#xff0c;从第三行开始&#xff0c;非首尾的元素值等于上一行同列的元素与该元素之前的元素之和&#xff0c;即 t [ j ] r e t …

【自动化测试】Appium 生态工具以及Appium Desktop如何安装和使用

引言 Appium 是一个开源的自动化测试框架&#xff0c;用于测试原生、移动 Web 和混合应用程序。它支持 iOS、Android 和 Windows 平台。Appium 生态系统包含多个工具和库&#xff0c;这些工具和库可以与 Appium 一起使用&#xff0c;以提高移动应用的自动化测试效率 文章目录 引…

[翟旭发射器]python-推导式-列表list表达式练习

# 简单的列表生成 numbers00[x for x in range(1,11)] print(numbers00) # 带条件的列表生成 numbers01[x for x in range(1,11) if x%20] print(numbers01) # 带表达式的列表生成 numbers10[x**2 for x in range(1,11)] print(numbers10) # 嵌套循环的列表生成 coordinates[(x…

船舶检测系统源码分享

船舶检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

【Linux基础IO】深入解析Linux基础IO缓冲区机制:提升文件操作效率的关键

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;暂无 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀Linux基础IO &#x1f4d2;1. 什么是缓…

Golang plugin包教程:创建与管理插

Golang plugin包教程&#xff1a;创建与管理插 介绍plugin包什么是plugin包使用场景和优势使用场景优势 plugin包的基本用法如何创建插件编写插件代码编译插件 加载插件使用plugin.Open获取符号&#xff1a;plugin.Lookup 插件实例讲解实例一&#xff1a;简单的Hello插件编写He…

Java语言程序设计基础篇_编程练习题**18.39(拖动树)

目录 题目&#xff1a;**18.39(拖动树) 代码示例 代码逻辑解析 类定义和变量初始化 main 方法 start 方法 drawRecursiveTree 方法 动画演示 题目&#xff1a;**18.39(拖动树) 修改编程练习题18.38, 将树移动到鼠标所拖动到的位置 Java语言程序设计基础篇_编程练习题…