当前位置: 首页 > news >正文

利用Jackson封装常用的JsonUtil工具类

在实际开发中,我们对于 JSON 数据的处理,通常有这么几个第三方工具包可以使用:

  • gson:谷歌的
  • fastjson:阿里巴巴的
  • jackson:美国FasterXML公司的,Spring框架默认用的

由于以前一直用习惯了阿里的 fastjson,最近突然改为 jackson ,不是太习惯,所以手写一个工具类,应付一下工作中常用的一些方法。

1. 引入依赖包

在 pom.xml 文件中加入以下依赖

<!-- 引入jackson依赖包-->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version>
</dependency>

2. 编写 JsonUtil 工具类

package com.yuhuofei.utils;import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;/*** @Description 由于习惯了用fastjson处理JSON数据,突然改成用jackson,有些不适应,所以打算用jackson封装出类似fastjson里的方法进行使用* @ClassName JsonUtil* @Author yuhuofei* @Date 2023/8/19 14:36* @Version 1.0*/
@Slf4j
public class JsonUtil {private static ObjectMapper objectMapper = new ObjectMapper();// 时间日期格式private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss";//以静态代码块初始化static {//对象的所有字段全部列入序列化objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);//取消默认转换timestamps形式objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);//忽略空Bean转json的错误objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);//所有的日期格式都统一为以下的格式,即yyyy-MM-dd HH:mm:ssobjectMapper.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT));//忽略 在json字符串中存在,但在java对象中不存在对应属性的情况。防止错误objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);}/**===========================以下是从JSON中获取对象====================================*/public static <T> T parseObject(String jsonString, Class<T> object) {T t = null;try {t = objectMapper.readValue(jsonString, object);} catch (JsonProcessingException e) {log.error("JsonString转为自定义对象失败:{}", e.getMessage());}return t;}public static <T> T parseObject(File file, Class<T> object) {T t = null;try {t = objectMapper.readValue(file, object);} catch (IOException e) {log.error("从文件中读取json字符串转为自定义对象失败:{}", e.getMessage());}return t;}//将json数组字符串转为指定对象List列表或者Map集合public static <T> T parseJSONArray(String jsonArray, TypeReference<T> reference) {T t = null;try {t = objectMapper.readValue(jsonArray, reference);} catch (JsonProcessingException e) {log.error("JSONArray转为List列表或者Map集合失败:{}", e.getMessage());}return t;}/**=================================以下是将对象转为JSON=====================================*/public static String toJSONString(Object object) {String jsonString = null;try {jsonString = objectMapper.writeValueAsString(object);} catch (JsonProcessingException e) {log.error("Object转JSONString失败:{}", e.getMessage());}return jsonString;}public static byte[] toByteArray(Object object) {byte[] bytes = null;try {bytes = objectMapper.writeValueAsBytes(object);} catch (JsonProcessingException e) {log.error("Object转ByteArray失败:{}", e.getMessage());}return bytes;}public static void objectToFile(File file, Object object) {try {objectMapper.writeValue(file, object);} catch (JsonProcessingException e) {log.error("Object写入文件失败:{}", e.getMessage());} catch (IOException e) {e.printStackTrace();}}/**=============================以下是与JsonNode相关的=======================================*///JsonNode和JSONObject一样,都是JSON树形模型,只不过在jackson中,存在的是JsonNodepublic static JsonNode parseJSONObject(String jsonString) {JsonNode jsonNode = null;try {jsonNode = objectMapper.readTree(jsonString);} catch (JsonProcessingException e) {log.error("JSONString转为JsonNode失败:{}", e.getMessage());}return jsonNode;}public static JsonNode parseJSONObject(Object object) {JsonNode jsonNode = objectMapper.valueToTree(object);return jsonNode;}public static String toJSONString(JsonNode jsonNode) {String jsonString = null;try {jsonString = objectMapper.writeValueAsString(jsonNode);} catch (JsonProcessingException e) {log.error("JsonNode转JSONString失败:{}", e.getMessage());}return jsonString;}//JsonNode是一个抽象类,不能实例化,创建JSON树形模型,得用JsonNode的子类ObjectNode,用法和JSONObject大同小异public static ObjectNode newJSONObject() {return objectMapper.createObjectNode();}//创建JSON数组对象,就像JSONArray一样用public static ArrayNode newJSONArray() {return objectMapper.createArrayNode();}/**===========以下是从JsonNode对象中获取key值的方法,个人觉得有点多余,直接用JsonNode自带的取值方法会好点,出于纠结症,还是补充进来了*/public static String getString(JsonNode jsonObject, String key) {String s = jsonObject.get(key).asText();return s;}public static Integer getInteger(JsonNode jsonObject, String key) {Integer i = jsonObject.get(key).asInt();return i;}public static Boolean getBoolean(JsonNode jsonObject, String key) {Boolean bool = jsonObject.get(key).asBoolean();return bool;}public static JsonNode getJSONObject(JsonNode jsonObject, String key) {JsonNode json = jsonObject.get(key);return json;}
}

3. 测试

新建一个 User 类

package com.yuhuofei.entity;import lombok.Data;import java.io.Serializable;/*** @Description* @ClassName User* @Author yuhuofei* @Date 2023/8/19 14:49* @Version 1.0*/
@Data
public class User implements Serializable {private static final long serialVersionUID = 1L;private Integer id;private String name;private String passWord;
}

新建一个测试类

import com.yuhuofei.entity.User;
import com.yuhuofei.utils.JsonUtil;/*** @Description* @ClassName TestJsonUtil* @Author yuhuofei* @Date 2023/8/19 14:58* @Version 1.0*/
public class TestJsonUtil {public static void main(String[] args) {String jsonString = "{\"id\":11,\"name\":\"小明\",\"passWord\":\"123456\"}";User user = JsonUtil.parseObject(jsonString, User.class);System.out.println(user);}
}

执行 main 方法测试,可以看到在控制台正确地输出了结果。
在这里插入图片描述

相关文章:

利用Jackson封装常用的JsonUtil工具类

在实际开发中&#xff0c;我们对于 JSON 数据的处理&#xff0c;通常有这么几个第三方工具包可以使用&#xff1a; gson&#xff1a;谷歌的fastjson&#xff1a;阿里巴巴的jackson&#xff1a;美国FasterXML公司的&#xff0c;Spring框架默认用的 由于以前一直用习惯了阿里的…...

阿里云2核4G服务器配置汇总表_轻量和ECS

阿里云2核4G服务器配置价格表&#xff0c;297元一年&#xff0c;配置为轻量应用服务器2核4G、4M带宽、60GB高效云盘&#xff0c;折合24元一个月。 目录 2核4G服务器轻量&#xff1a; 2核4G服务器ECS 关于轻量和ECS的区别&#xff1a; 2核4G服务器轻量&#xff1a; 云服务器…...

攻防世界-ics-06

原题解题思路 看着页面多&#xff0c;其实只有报表中心能够跳转&#xff0c;但是选了确定后没反应&#xff0c;应该不是注入&#xff0c;只有id会变化。 在burp中设置好负载进行爆破 有一个长度与众不同的包 打开发现flag。...

人工智能轨道交通行业周刊-第56期(2023.8.14-8.20)

本期关键词&#xff1a;数字化建设、巡检机器人、智慧城轨、福州地铁4号线、避雷器、LangChain 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMet…...

ruoyi-vue-pro yudao 项目报表设计器 积木报表模块启用及相关SQL脚本

目前ruoyi-vue-pro 项目虽然开源&#xff0c;但是report模块被屏蔽了&#xff0c;查看文档却要收费 199元&#xff08;知识星球&#xff09;&#xff0c;价格有点太高了吧。 分享下如何启用 report 模块&#xff0c;顺便贴上sql相关脚本。 一、启用模块 修改根目录 pom.xml …...

【第三阶段】kotlin中使用带let的安全调用

let常常和&#xff1f;.配合使用&#xff0c;如果前面的对象为null,let不执行&#xff0c;能够执行到let里面 对象一定不为null 1.不为null fun main() {var name:String?"kotlin" //name是一个可空类型&#xff0c;发出广播&#xff0c;调用的地方必须补救措施var…...

JavaScript 快速入门手册

本篇文章学习&#xff1a; 菜鸟教程、尚硅谷。 JavaScript 快速入门手册 &#x1f4af; 前言&#xff1a; 本人目前算是一个Java程序员&#xff0c;但是目前环境… ε(ο&#xff40;*))) 一言难尽啊&#xff0c;blog也好久好久没有更新了&#xff0c;一部分工作原因吧(外包真…...

FreeMarker系列--list的用法(长度,遍历,下标,嵌套,排序)

原文网址&#xff1a;FreeMarker系列--list的用法&#xff08;长度,遍历,下标,嵌套,排序&#xff09;_IT利刃出鞘的博客-CSDN博客 简介 本文介绍FreeMarker的list的用法。 大小 Java ArrayList<String> list new ArrayList<String>(); Freemaker ${list?s…...

【观察】戴尔科技:构建企业创新“韧性”,开辟数实融合新格局

过去几年&#xff0c;国家高度重视发展数字经济&#xff0c;将其上升为国家战略。其中&#xff0c;“十四五”规划中&#xff0c;就明确提出要推动数字经济和实体经济的深度融合&#xff0c;以数字经济赋能传统产业转型升级&#xff1b;而2023年年初正式发布的《数字中国建设整…...

数据管理平台

数据管理平台项目 文章目录 数据管理平台项目业务1-登录验证代码步骤&#xff1a; token 技术token的使用代码步骤 axios 请求拦截器语法代码示例 axios响应拦截器优化axios响应结果发布文章-富文本编辑器发布文章-频道列表发布文章-封面设置发布文章-收集并保存内容管理-文章列…...

手搓大语言模型 使用jieba分词制作词表,词表大小几十万 加强依赖性

jieba分词词表生成与训练 import numpy as np import paddle import pandas as pd from multiprocessing import Process, Manager, freeze_support from just_mask_em import JustMaskEm, HeadLoss from tqdm import tqdm from glob import glob import jieba import warning…...

【校招VIP】java语言类和对象之map、set集合

考点介绍&#xff1a; map、set集合相关内容是校招面试的高频考点之一。 map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索效率与其具体的实例化子类有关系。 『java语言类和对象之map、set集合』相关题目及解析内容可点击文章末尾链接查看&#xff01; …...

windows服务器下java程序健康检测及假死崩溃后自动重启应用、开机自动启动

前两天由于项目需要&#xff0c;一个windows上的批处理任务&#xff08;kitchen.bat&#xff09;&#xff0c;需要接到mq的消息通知后执行&#xff0c;为了快速实现这里我们通过springboot写了一个jar程序&#xff0c;用于接收mq的消息&#xff0c;并调用bat文件。 本程序需要实…...

七夕特辑(一)浪漫表白方式 用神经网络生成一首情诗

目录 一、准备工作二、用神经网络生成一首诗&#xff0c;代码说明 牛郎织女相会&#xff0c;七夕祝福要送来。祝福天下有情人&#xff0c;终成眷属永相伴。 七夕是中国传统的情人节&#xff0c;也是恋人们表达爱意的好时机。在这个特别的日子里&#xff0c;送上温馨的祝福&…...

springboot的 spring.redis.lettuce的max-active、max-idle、min-idle的搭配

在Spring Boot中&#xff0c;使用Lettuce作为Redis客户端是一种常见的选择。Lettuce是一个高性能、可扩展的异步Redis客户端。下面是关于application.yml配置文件中spring.redis.lettuce的一些配置&#xff1a; spring:redis:host: localhostport: 6379database: 0lettuce:poo…...

盒子模型样式

&#x1f353;盒子属性 属性名称中文注释备注border设置盒子的边框边框宽度 边框类型 边框颜色border-left设置左边框边框宽度 边框类型 边框颜色border-right设置右边框边框宽度 边框类型 边框颜色border-top设置上边框边框宽度 边框类型 边框颜色border-bottom设置下边框边框…...

动态规划入门之线性动态规划

P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目要求求连续得一段子串使其累加和最大。 我们做动态规划首先考虑小情况&#xff0c;然后推而广之。 假设三个数1&#xff0c;-2&#xff0c;5. 我们先选1然后我们在-2以及-2加1里边选&#xff0c;我们选…...

基于HTML+CSS+Echarts大屏数据可视化集合共99套

基于HTMLCSSEcharts大屏数据可视化集合共99套 一、介绍二、展示1.大数据展示系统2.物流订单系统3.物流信息系统4.办税渠道监控平台5.车辆综合管控平台 三、其他系统实现四、获取源码 一、介绍 基于HTML/CSS/Echarts的会议展览、业务监控、风险预警、数据分析展示等多种展示需求…...

Leetcode 0814周总结

本周刷题&#xff1a; 88, 108, 121, 219, 228, 268, 283, 303, 349, 350, 414, 448 88 合并两个有序数组 nums1{1, 2, 3 ,0, 0, 0} nums2{2, 5, 6} 合成效果&#xff1a;nums1{1, 2, 2, 3, 5, 6} 思路&#xff1a;【双指针】对两个数组设置双指针&#xff0c;依次比较哪…...

华为网络篇 OSPF的Silent-Interface-33

难度1复杂度1 目录 一、实验拓扑 二、实验步骤 三、实验过程 总结 一、实验拓扑 二、实验步骤 1.搭建如图所示的网络拓扑&#xff1b; 2.初始化各设备&#xff0c;配置相应的IP地址&#xff0c;测试直连网络的连通性&#xff1b; 3.整个网络配置OSPF协议&#xff0c;查看…...

告别报错!保姆级教程:在PyCharm 2023.3上完美安装ManimCE(附国内镜像加速)

在PyCharm 2023.3中零失败安装ManimCE的终极指南 当数学可视化遇上Python&#xff0c;ManimCE无疑是当前最强大的工具之一。但对于许多开发者来说&#xff0c;从环境配置到成功运行第一个动画&#xff0c;这段旅程往往充满坎坷。本文将彻底解决安装过程中的所有痛点&#xff0c…...

运动分析革命:如何用Kinovea将视频变成精准的教练和研究员

运动分析革命&#xff1a;如何用Kinovea将视频变成精准的教练和研究员 【免费下载链接】Kinovea Video solution for sport analysis. Capture, inspect, compare, annotate and measure technical performances. 项目地址: https://gitcode.com/gh_mirrors/ki/Kinovea …...

Windows Cleaner专业级深度优化实战:高效解决C盘空间不足与系统卡顿难题

Windows Cleaner专业级深度优化实战&#xff1a;高效解决C盘空间不足与系统卡顿难题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner Windows Cleaner是一款基于Py…...

Docker 学习笔记:镜像分发、容器运行与资源限制

Docker 学习笔记&#xff1a;镜像分发、容器运行与资源限制本笔记续接上一部分&#xff0c;涵盖镜像命名与分发、容器的核心操作、底层技术&#xff08;cgroup/namespace&#xff09;以及 CPU/内存资源限制。所有案例代码均经验证&#xff0c;直接可用。8. 镜像命名与分发最佳实…...

凌扬微优势代理 LY3206S / LY3206L 多模式电机驱动芯片 SOP8 技术解析

在剃须刀、理发剪、毛球修剪器等便携式马达产品中&#xff0c;需要一款集成锂电池充电管理、电机驱动、多种档位模式&#xff08;1/2/3档&#xff09;以及使能控制的芯片&#xff0c;以简化电路设计并满足不同产品需求。LY3206是一款集成了锂电池充电管理模块、电机驱动模块、续…...

一句话就能“劫持”你的AI?DZS 分层式自适应提示词注入攻击的防御机制框架 (HAA)来了!

本文所展示的提示词技术已在Research square 发表论文预印本。DOI&#xff1a;https://doi.org/10.21203/rs.3.rs-9653510/v1 作者“抖知书&#xff08;douzhishu&#xff09;&#xff0c;涉及到相关测试数据是本人自行测试的&#xff0c;并未通过多专家评审&#xff0c;所以仅…...

不只是显示中文:用fbterm给你的CentOS终端换个‘皮肤’,提升老旧服务器运维效率

终端美学革命&#xff1a;用fbterm打造高效CentOS字符界面工作环境 在服务器运维的世界里&#xff0c;图形界面往往被视为奢侈品。当您面对一台资源受限的老旧CentOS服务器&#xff0c;或者需要远程管理没有X11支持的机器时&#xff0c;字符界面就成了唯一的选择。但单调的终端…...

AI产品技能库:将顶尖产品智慧注入Claude Code的实战指南

1. 项目概述&#xff1a;当AI助手遇上产品大师的智慧如果你是一名产品经理、创业者&#xff0c;或者任何需要与产品打交道的人&#xff0c;最近可能已经感受到了AI助手带来的效率革命。无论是用Claude Code写代码&#xff0c;还是用ChatGPT梳理思路&#xff0c;这些工具正在成为…...

Adobe-GenP 3.0:三步解锁Adobe全家桶的终极指南

Adobe-GenP 3.0&#xff1a;三步解锁Adobe全家桶的终极指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为昂贵的Adobe Creative Cloud订阅费而烦恼吗&#…...

告别乱码!手把手教你用Processing为Arduino TFT_eSPI屏幕制作专属中文字库(附完整源码)

告别乱码&#xff01;手把手教你用Processing为Arduino TFT_eSPI屏幕制作专属中文字库&#xff08;附完整源码&#xff09; 在嵌入式开发中&#xff0c;TFT屏幕的中文显示一直是创客们头疼的问题。传统的解决方案要么占用大量存储空间&#xff0c;要么显示效果不尽如人意。本文…...