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

五分钟学会如何封装Jsckson工具类

        前言:在 Java 开发中,JSON 是一种非常常见的数据格式,而 Jackson 是处理 JSON 的主流库之一,为了提高代码的复用性、可维护性,我们通常会将 Jackson 的操作封装成一个工具类,简化使用。


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

目录

1.创建JacksonUtil工具类并私有化其构造函数

2.将ObjectMapper单例化

3.简化异常捕获

4.对常用方法进行封装

5.JacksonUtil工具类代码


1.创建JacksonUtil工具类并私有化其构造函数

        对于封装的工具类,我们不需要创建其实例对象,我们一般都直接使用其静态方法即可,所以我们将其构造函数进行私有化。

private JacksonUtil(){}

2.将ObjectMapper单例化

        由于ObjectMapper在多线程环境下是线程安全的,所以我们在使用的时候只需要创建一个实例对象即可,所以我们将ObjectMapper单例化。

/*** 给ObjectMapper进行单例模式,由于ObjectMapper 是线程安全的,可以复用,放置重复创建影响性能*/private static final ObjectMapper objectMapper;static {objectMapper = new ObjectMapper();}public static ObjectMapper getObjectMapper(){return objectMapper;}

3.简化异常捕获

        由于在使用ObjectMapper中的方法的时候,会抛出异常,如果我们手动的try-catch会十分的麻烦,所以我们借鉴java内部对异常的简化。

public static final <T> T tryParse(Callable<T> parser) {return JacksonUtil.tryParse(parser, JacksonException.class);}public static final <T> T tryParse(Callable<T> parser, Class<? extends Exception> check) {try {return parser.call();}catch (Exception ex) {if (check.isAssignableFrom(ex.getClass())) {throw new JsonParseException(ex);}throw new IllegalStateException(ex);}}

4.对常用方法进行封装

        最后,我们对常用方法进行封装即可。

// 普通对象和List对象共同使用public static String writeValueAsString(Object object){return JacksonUtil.tryParse(()->{return JacksonUtil.getObjectMapper().writeValueAsString(object);});}// 普通对象的反序列化public static <T> T readValue(String str,Class<T> valueType){return JacksonUtil.tryParse(()->{return JacksonUtil.getObjectMapper().readValue(str,valueType);});}// List类型的反序列化public static <T> T readListValue(String str,Class<?> valueType){JavaType javaType = JacksonUtil.getObjectMapper().getTypeFactory().constructParametricType(List.class,valueType);return JacksonUtil.tryParse(()->{return JacksonUtil.getObjectMapper().readValue(str,javaType);});}

5.JacksonUtil工具类代码

        以下是封装JacksonUtil工具类的整体代码:

package com.test.lotterysystem.Comment.Utils;import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.json.JsonParseException;
import org.springframework.util.ReflectionUtils;import java.util.List;
import java.util.concurrent.Callable;// 将繁琐的异常处理进行了解决
public class JacksonUtil {/*** 工具类不需要创建实例对象*/private JacksonUtil(){}/*** 给ObjectMapper进行单例模式,由于ObjectMapper 是线程安全的,可以复用,放置重复创建影响性能*/private static final ObjectMapper objectMapper;static {objectMapper = new ObjectMapper();}public static ObjectMapper getObjectMapper(){return objectMapper;}public static final <T> T tryParse(Callable<T> parser) {return JacksonUtil.tryParse(parser, JacksonException.class);}public static final <T> T tryParse(Callable<T> parser, Class<? extends Exception> check) {try {return parser.call();}catch (Exception ex) {if (check.isAssignableFrom(ex.getClass())) {throw new JsonParseException(ex);}throw new IllegalStateException(ex);}}// 普通对象和List对象共同使用public static String writeValueAsString(Object object){return JacksonUtil.tryParse(()->{return JacksonUtil.getObjectMapper().writeValueAsString(object);});}// 普通对象的反序列化public static <T> T readValue(String str,Class<T> valueType){return JacksonUtil.tryParse(()->{return JacksonUtil.getObjectMapper().readValue(str,valueType);});}// List类型的反序列化public static <T> T readListValue(String str,Class<?> valueType){JavaType javaType = JacksonUtil.getObjectMapper().getTypeFactory().constructParametricType(List.class,valueType);return JacksonUtil.tryParse(()->{return JacksonUtil.getObjectMapper().readValue(str,javaType);});}}


以上就是本篇文章的全部内容了~~~

http://www.xdnf.cn/news/586891.html

相关文章:

  • OpenCV CUDA 模块图像过滤------创建一个高斯滤波器函数createGaussianFilter()
  • Python中的并发编程
  • Java集合框架与三层架构实战指南:从基础到企业级应用
  • OceanBase 系统表查询与元数据查询完全指南
  • 使用web3工具结合fiscobcos网络部署调用智能合约
  • JAVA:柔性一致性策略 BASE 原则
  • tasklet上下文内存分配触发might_alloc检查及同步回收调用链
  • 【C++】笔试强训 第一天
  • 【学习笔记】机器学习(Machine Learning) | 第七章|神经网络(3)
  • 并发编程之线程安全
  • 云原生安全 SaaS :从基础到实践
  • 驱动钛丝(SMA)的应用(5)汽车腰托气阀常见问题及解决方案
  • 101个α因子#23
  • 如何让 Agent 有计划地进行股票数据分析?——基于 DeepSeek 的实战应用
  • linux字符模式关闭光标
  • Linux操作系统:fork+exec进程创建
  • win11远程桌面设置60fps无效
  • 面试题 17.16. 按摩师
  • 软件开发的设计原则
  • 徐少春迎来AI的春天
  • spring中的BeanFactoryAware接口详解
  • 关于我对传统系统机构向大模型架构演进的认知
  • 无线网络优化配置:让你的Wi-Fi更快更稳
  • java: Can‘t generate mapping method with primitive return type
  • 高级SQL技巧:时序数据查询优化与性能调优实战
  • 天文数据处理:基于CUDA的射电望远镜图像实时去噪算法(开源FAST望远镜数据处理代码解析)
  • github cli主要用途,优势,和git的区别
  • PageHelper分页原理解析:从源码到MySQL方言实现
  • 基于开源AI大模型与智能硬件的零售场景服务创新研究——以AI智能名片与S2B2C商城小程序源码融合为例
  • [安全清单] Linux 服务器安全基线:一份可以照着做的加固 Checklist