Jackson(json) 与其他格式数据的转换

目录

  • 第一章、Jackson 介绍
    • 1.1)Jackson 依赖导入
    • 1.2)转义字符介绍介绍
  • 第二章、Jackson 与其他格式数据的转换
    • 2.1)其他数据转为JSON格式数据(生成JSON)
      • ①对象转json,比如我有一个user对象
      • ②list转json
      • ③map转json
      • ③复杂map转json
    • 2.2)JSON格式数据转为其他数据(解析JSON)
      • ①json字符串信息 写入(转为) 对象
      • ②将JSON文件转为对象
      • ③字节输入流读取json文件后,再转为对象
      • ④JSON字符串 转为 Map
      • ⑤复杂JSON(json数组中有多个对象) 转为 对象数组
      • ⑤复杂JSON(json数组中有多个对象) 转为List
  • 第三章、其他使用
    • 3.1)忽略不存在的字段
    • 3.2)使用jackson进行日期格式化
    • 3.3)Jackson注解
      • ①@JsonIgnore
      • ②@JsonGetter
      • ③@JsonSetter

友情提醒:
先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。

第一章、Jackson 介绍

1.1)Jackson 依赖导入

将不同的数据格式与JSON格式进行转换需要依赖第三方包

JSON      //json官方提供的
FastJson  //阿里巴巴提供
Jackson   //springboot启动包自带
GSON      //Google提供的
hutool json   //hutool 工具

第三方包有很多,选择一种就好了,这里选择Jackson
①导入依赖

Jackson 解析JSON,SpringMVC内置的解析器就是这个
spring-boot-starter-web启动包内嵌了Jackson 依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.16</version></dependency>

或者也可以自己导入依赖包

maven依赖:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.6</version>
</dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.6</version>
</dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.6</version>
</dependency>

②Jackson包中ObjectMapper类介绍
1、常用方法1:readValue() 方法可以进行 JSON 的反序列化操作,就是将其他格式数转为Java对象
2、常用方法2:writeValue() 方法可以进行 JSON 的序列化操作,就是将 Java 对象转换成 JSON 字符串

1.2)转义字符介绍介绍

Java中看到的JSON字符经常带有斜杠,其实是转义符,例如:

\r  将光标定位到当前行的开头,不会跳到下一行。
\n  换到下一行的开头。
\t  制表符,将光标移到下一个制表符的位置,就像在文档中用Tab键一样。
\\  表示反斜杠字符,由于在Java代码中的反斜杠(\)是转义字符,多加一个反斜杠就代表其本身

\"表示双引号字符,Java代码中双引号表示字符串的开始和结束,包含在字符串中的双引号需要使用 \ 进行转义

String str = "{\"name\":\"bbb\",\"id\":\"1234\"}"
其实是 str = {"name":"bbb","id":"1234"}

第二章、Jackson 与其他格式数据的转换

2.1)其他数据转为JSON格式数据(生成JSON)

首先我有个User类

package com.test.springboot.model;
public class User {private String name;private int age;private List<String> skillsList;
//省略getter setter toString

①对象转json,比如我有一个user对象

使用方法:objectMapper.writeValueAsString(类名);

    public static void objectToJson() {User user = new User();user.setName("bbb");user.setAge(18);user.setSkillsList(Arrays.asList("java", "python"));// 创建ObjectMapper对象ObjectMapper objectMapper = new ObjectMapper();String json = null;try {// 将对象转换为JSON字符串json = objectMapper.writeValueAsString(user);} catch (JsonProcessingException e) {e.printStackTrace();}//{"name":"bbb","age":18,"skillsList":["java","python"]}System.out.println(json);}

②list转json

 public void listToJson() {List<String> list = new ArrayList<>();list.add("item1");list.add("item2");list.add("item3");System.out.println("list---"+list);ObjectMapper mapper = new ObjectMapper();try {String json = mapper.writeValueAsString(list);System.out.println("json---"+json);} catch (JsonProcessingException e) {e.printStackTrace();}}

③map转json

 public void mapToJson() {Map<String, String> map = new HashMap<>();map.put("名字", "薄饼");map.put("年龄", "12");ObjectMapper mapper = new ObjectMapper();try {String json = mapper.writeValueAsString(map);System.out.println(json);} catch (JsonProcessingException e) {e.printStackTrace();}}

③复杂map转json

    public void mapListToJson() {//rootMap集合存储信息Map<String, Object> rootMap = new HashMap<>();rootMap.put("notificationType", "call_service");//serviceMap集合存储信息Map<String, Object> serviceMap = new HashMap<>();serviceMap.put("appKey", "Data.appKey");//paraList中存储多个alaMapList<Map<String, Object>> paraList = new ArrayList<>();Map<String, Object> alaMap= new HashMap<>();alarmMap.put("a", "zh110");alarmMap.put("b", "zh120");alarmMap.put("notify", "[Info1|Info2|Info3]");paraList.add(alaMap);serviceMap.put("notifications", paraList);rootMap.put("call_service", serviceMap);ObjectMapper mapper = new ObjectMapper();try {String rootMapJson = mapper.writeValueAsString(rootMap);System.out.println(rootMapJson);} catch (JsonProcessingException e) {e.printStackTrace();}}

2.2)JSON格式数据转为其他数据(解析JSON)

①json字符串信息 写入(转为) 对象

首先我有个User类

package com.test.springboot.model;
public class User {private String name;private int age;private List<String> skillsList;
//省略getter setter toString

使用objectMapper.readValue(json, User.class);方法,前面传入json字符串,后面是类

 //json字符串信息 写入(转为) 对象public static void jsonToObject(){String json = "{\"name\":\"bbb\",\"age\":18,\"skillsList\":[\"java\",\"python\",\"php\"]}";ObjectMapper objectMapper = new ObjectMapper();User user = null;try {user = objectMapper.readValue(json, User.class);} catch (JsonProcessingException e) {e.printStackTrace();}//User(name=bbb, age=18, skillsList=[java, python, php])System.out.println(user);//{"name":"bbb","age":18,"skillsList":["java","python","php"]}System.out.println(json);}

②将JSON文件转为对象

001-test/src下新建json文件,内容如下

{"name" : "bbb","age" : 18,"skillsList" : ["java","python"]
}

如图:
在这里插入图片描述
使用readValue方法

public static void jsonFileToObject() {File file = new File("001-test/src/test.json");ObjectMapper objectMapper = new ObjectMapper();User user = null;try {user = objectMapper.readValue(file, User.class);} catch (IOException e) {e.printStackTrace();}//User(name=bbb, age=18, skillsList=[java, python])System.out.println(user);}

③字节输入流读取json文件后,再转为对象

    //通过字节输入流FileInputStream 读取json文件后,再转为对象public static void jsonFileInputStrToObject() {FileInputStream input = null;try {input = new FileInputStream("001-test/src/test.json");} catch (FileNotFoundException e) {e.printStackTrace();}ObjectMapper objectMapper = new ObjectMapper();User user = null;try {user = objectMapper.readValue(input, User.class);} catch (IOException e) {e.printStackTrace();}//User{name='bbb', age=18, skillsList=[java, python]}System.out.println(user);}

④JSON字符串 转为 Map

   //JSON字符串 转为 Mappublic static void jsonToMap() {String json = "{\"name\":\"bbb\",\"age\":18,\"skillsList\":[\"java\",\"python\",\"php\"]}";ObjectMapper objectMapper = new ObjectMapper();Map<String, Object> objectMap = null;try {objectMap = objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {});} catch (JsonProcessingException e) {e.printStackTrace();}//{name=bbb, age=18, skillsList=[java, python, php]}System.out.println(objectMap);//bbbSystem.out.println(objectMap.get("name"));}

⑤复杂JSON(json数组中有多个对象) 转为 对象数组

readValue方法

    public static void jsonArrToObject() {String json = "[{\"name\":\"bbb\",\"age\":18,\"skillsList\":[\"java\",\"python\"]}," +"{\"name\":\"aaa\",\"age\":15,\"skillsList\":[\"唱跳\",\"rap\"]}]";ObjectMapper objectMapper = new ObjectMapper();User[] user = new User[0];try {user = objectMapper.readValue(json, User[].class);} catch (JsonProcessingException e) {e.printStackTrace();}//User{name='bbb', age=18, skillsList=[java, python]}//User{name='aaa', age=15, skillsList=[唱跳, rap]}for (User user1 : user) {System.out.println(user1);}}

⑤复杂JSON(json数组中有多个对象) 转为List

readValue方法

    public static void jsonListToList() {String json = "[{\"name\":\"bbb\",\"age\":18,\"skillsList\":[\"java\",\"python\"]}," +"{\"name\":\"aaa\",\"age\":15,\"skillsList\":[\"唱跳\",\"rap\"]},"+"{\"name\":\"ccc\",\"age\":10,\"skillsList\":[\"biu\",\"pon\"]}]";ObjectMapper objectMapper = new ObjectMapper();List<User> list = null;try {list = objectMapper.readValue(json, new TypeReference<List<User>>(){});} catch (JsonProcessingException e) {e.printStackTrace();}// User{name='bbb', age=18, skillsList=[java, python]}//  User{name='aaa', age=15, skillsList=[唱跳, rap]}//  User{name='ccc', age=10, skillsList=[biu, pon]}for (User user1 : list) {System.out.println(user1);}}

第三章、其他使用

3.1)忽略不存在的字段

如果 JSON出现了 Java 类中不存在的属性,转 Java 对象时会报com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException 异常。
使用configure方法,设置false来忽略

    public static void jsonIgn() {String json = "{\"需要忽略的\":\"需要忽略\",\"name\":\"bbb\",\"age\":18,\"skillsList\":[\"java\",\"python\"]}";ObjectMapper objectMapper = new ObjectMapper();//忽略字段设置objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);User user=null;try {user = objectMapper.readValue(json, User.class);} catch (JsonProcessingException e) {e.printStackTrace();}//User{name='bbb', age=18, skillsList=[java, python]}System.out.println(user);}

3.2)使用jackson进行日期格式化

①添加数据绑定支持包依赖

<dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-jsr310</artifactId><version>2.13.3</version>
</dependency>

②在类中使用注解@JsonFormat

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {private Integer id;@JsonFormat(pattern = "yyyy年MM月dd日 HH时mm分ss秒",timezone = "Asia/Shanghai")private Date date;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "Asia/Shanghai")private LocalDateTime localDateTime;
}

③定义 ObjectMapper 时通过 findAndRegisterModules() 方法来注册依赖。然后再互相转换

//Jackson 日期格式化
public class JsonToJava9 {public static void main(String[] args) throws IOException {ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules();Order order = new Order();order.setId(1);order.setDate(new Date());order.setLocalDateTime(LocalDateTime.now());//将java转换成json字符串String json = objectMapper.writeValueAsString(order);//{"id":1,"date":"2023年07月28日 15时14分01秒","localDateTime":"2023-07-28 15:14:01"}System.out.println(json);//将json字符串转换成java对象Order orderObject = objectMapper.readValue(json, Order.class);//Order(id=1, date=Fri Jul 28 15:15:59 CST 2023, localDateTime=2023-07-28T15:15:59)System.out.println(orderObject);}
}

3.3)Jackson注解

①@JsonIgnore

使用 @JsonIgnore可以忽略某个 Java 对象中的属性,它将不参与 JSON 的序列化与反序列化

②@JsonGetter

使用 @JsonGetter可以在对 Java 对象进行 JSON 序列化时自定义属性名称。写在getter方法上

 @JsonGetter(value = "catName")public String getName() {return name;}

输出结果,name 已经设置成了 catName:

{"age":2,"catName":"Tom"}

③@JsonSetter

使用 @JsonSetter可以在对 JSON 进行反序列化时设置 JSON 中的 key 与 Java 属性的映射关系。用在属性上

比如我json中是这样catName

String json = "{\"age\":2,\"catName\":\"Tom\"}";

为了我这个name能对应上json内容,通过注解设置成catName

 @JsonSetter(value = "catName")public void setName(String name) {this.name = name;}

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

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

相关文章

内存管理机制SLAB

1. 为什么需要内存分配管理&#xff1f;为什么需要SLAB&#xff1f; 在学习c语言时&#xff0c;我们常常会使用到malloc()去申请一块内存空间&#xff0c;用于存放我们的数据&#xff0c;这是代码层面的语言 如果我们想要关心malloc这个命令向系统发出后&#xff0c;系统会做什…

解决 VSCode 编辑器点击【在集成终端中打开】出现新的弹框

1、问题描述 在 VSCode 的项目下&#xff0c;鼠标右键&#xff0c;点击【在集成终端中打开】&#xff0c;出现新的一个弹框。新版的 VSCode 会有这个问题&#xff0c;一般来说我们都希望终端是在 VSCode 的控制台中打开的&#xff0c;那么如何关闭这个弹框呢&#xff1f; 2、解…

室友打团太吵?一条命令让它卡死

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;更多干货&#xff0c;请关注专栏《网络安全自学教程》 SYN Flood 1、hping3实现SYN Flood1.1、主机探测1.2、扫描端…

文本识别 OCR 解决方案

Capture2Text 便携式 OCR 工具 Capture2Text 能够使用键盘快捷键快速对屏幕的一部分进行 OCR。 默认情况下&#xff0c;生成的文本将保存到剪贴板。支持中文、英文、法文、德文、日文、韩文、俄文、西班牙文等 90 多种语言。 Capture2Text 是便携式工具&#xff0c;不需要安装…

数据库引论:4、使用E-R模型的数据库设计

4.1 设计过程概览 图1 开发数据库应用包含的任务 真实世界 ⇒ \Rightarrow ⇒概念模型 ⇒ \Rightarrow ⇒逻辑模型 ⇒ \Rightarrow ⇒物理模型 数据库设计&#xff1a; 概念设计(Conceptual design)&#xff1a; 用一个概念模型描述物理世界的一个主体 逻辑设计(Logical desi…

42.基于SpringBoot + Vue实现的前后端分离-服装销售平台管理系统(项目 + 论文)

项目介绍 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的交换和信息流通显得特别重要。因此&#xff0c;开发合适的服装销售平台成为企业必然要走的一步棋。开发合适的服…

场景文本检测识别学习 day01(传统OCR的流程、常见的损失函数)

传统OCR的流程 传统OCR&#xff1a;传统光学字符识别常见的的模型主要包括以下几个步骤来识别文本 预处理&#xff1a;预处理是指对输入的图像进行处理&#xff0c;以提高文字识别的准确率。这可能包括调整图像大小、转换为灰度图像、二值化&#xff08;将图像转换为黑白两色&…

学习人工智能:为何PyTorch深度学习框架不可或缺

在人工智能&#xff08;AI&#xff09;的浩瀚领域中&#xff0c;深度学习作为其核心分支&#xff0c;正以其强大的数据处理能力、模式识别能力和预测能力引领着科技的飞速发展。而在深度学习的众多工具与框架中&#xff0c;PyTorch无疑是一颗璀璨的明星。本文将从PyTorch的特点…

【WSN覆盖优化】基于灰狼优化算法的无线传感器网络覆盖 GWO-WSN覆盖优化【Matlab代码#74】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 灰狼优化算法2. WSN节点感知模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 1. 灰狼优化算法 此处略。 2.…

推动科技创新润德生物邀您到场参观2024第13届生物发酵展

参展企业介绍 山东润德生物科技有限公司成立于2014年10月17日&#xff0c;是一家围绕生物制品的研发、生产、营销、国际贸易、技术服务为核心业务的国家高新技术企业&#xff0c;近年来荣获国家制造业单项冠军示范企业、国家级绿色工厂、国家知识产权优势企业、国家工业产品绿…

目标跟踪——行人检测数据集

一、重要性及意义 目标跟踪和行人检测是计算机视觉领域的两个重要任务&#xff0c;它们在许多实际应用中发挥着关键作用。为了推动这两个领域的进步&#xff0c;行人检测数据集扮演着至关重要的角色。以下是行人检测数据集的重要性及意义的详细分析&#xff1a; 行人检测数据…

4核8G服务器性能怎么样?4核8G12M配置可应对哪些场景?

腾讯云4核8G服务器多少钱&#xff1f;腾讯云4核8G轻量应用服务器12M带宽租用价格646元15个月&#xff0c;活动页面 txybk.com/go/txy 活动链接打开如下图所示&#xff1a; 腾讯云4核8G服务器优惠价格 这台4核8G服务器是轻量应用服务器&#xff0c;详细配置为&#xff1a;轻量4核…

基于Spring Boot+Vue的汽车销售系统

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统汽车销售信息管理难度大&#xff0c;容错率低&#xff0…

【Linux】达梦数据库安装部署(附详细图文)

目录 一、安装前的准备工作 1.检查操作系统配置 &#xff08;1&#xff09;获取系统位数 getconf LONG_BIT &#xff08;2&#xff09;查看操作系统release信息 cat /etc/system-release &#xff08;3&#xff09;查询系统名称 uname -a &#xff08;4&#xff09;查看操…

VS Code远程连接服务器运行python程序

之前一直用pycharm连接服务器跑程序&#xff0c;pycharm需要本地和远程都存一份代码&#xff0c;然后把本地的更新同步到服务器上来实现代码修改&#xff0c;后来实习的时候发现企业里面都用VS Code&#xff0c;不得不说&#xff0c;VS Code真的很方便&#xff0c;直接连服务器…

「媒体宣传」科技IT行业有哪些媒体邀约资源-51媒体网

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 科技IT行业的媒体邀约资源非常丰富&#xff0c;包括了各种类型的传统媒体和新兴的网络媒体平台。以下是一些主要的媒体邀约资源&#xff1a; 除此之外&#xff0c;还有一些其他科技类网络…

算法 第34天 贪心3

1005 K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可能…

Failed to start docker.service: Unit is not loaded properly: Invalid argument.

Failed to start docker.service: Unit is not loaded properly: Invalid argument. 未知原因&#xff1a;docker服务无法正常load 解决方式&#xff1a; 卸载docker&#xff0c; 删除docker.service 重新安装docker Docker是一种相对使用较简单的容器&#xff0c;我们可以通过…

【QT+QGIS跨平台编译】063:【qca-softstore+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、qca-softstore介绍二、QCA下载三、文件分析四、pro文件五、编译实践5.1 windows下编译5.2 linux下编译5.3 macos下编译一、qca-softstore介绍 QCA-Softstore 是一个软件证书存储插件,它是为 QCA 框架设计的。这个插件提供了一个简单的持久化证书…

SpringCloud Alibaba Sentinel 规则持久化

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十七篇&#xff0c;即使用 Sentinel 实现规则持久化。 二、概述 从前面我们做的实验可知&#xff0c;…