在SpringBoot中的Jackson使用笔记

news2024/9/22 13:45:59

在SpringBoot中的Jackson使用笔记

常用的java转json,json反序列化为java等方法,这里定义成一个工具类来用jackson

package cn.ath.knowwikibackend.util;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;

@Slf4j
public class JacksonUtil {
    private JacksonUtil() {
    }
    // 日期格式化
    private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss";

    /**
     * 配置正常的驼峰字段形式的json用的 OBJECT_MAPPER
     * {
     *     "name":"tom",
     *     "age: 22,
     *     "serialNumber":"STU0213131"
     * }
     */
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    static {
        //对象的所有字段全部列入
        OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.ALWAYS);
        //取消默认转换timestamps形式
        OBJECT_MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        //忽略空Bean转json的错误
        OBJECT_MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        //所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss
        OBJECT_MAPPER.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT));
        //忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误
        OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }


    /**
     * 配置 下划线字段形式的json用的 OBJECT_MAPPER
     * {
     *     "name":"tom",
     *     "age: 22,
     *     "serial_number":"STU0213131"
     * }
     */
    private static final ObjectMapper OBJECT_MAPPER_SNAKE_CASE = new ObjectMapper();
    static {
        //对象的所有字段全部列入
        OBJECT_MAPPER_SNAKE_CASE.setSerializationInclusion(JsonInclude.Include.ALWAYS);
        //取消默认转换timestamps形式
        OBJECT_MAPPER_SNAKE_CASE.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        //忽略空Bean转json的错误
        OBJECT_MAPPER_SNAKE_CASE.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        //所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss
        OBJECT_MAPPER_SNAKE_CASE.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT));
        //忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误
        OBJECT_MAPPER_SNAKE_CASE.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        //转换为下划线
        OBJECT_MAPPER_SNAKE_CASE.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
    }

    /**
     * 配置属性名不带引号的 非标准格式 的json 用的 OBJECT_MAPPER
     *
     * Neo4j场景会用到这种格式
     * {
     *     name:"tom",
     *     age: 22,
     *     serialNumber:"STU0213131"
     * }
     *
     * 如这个cql语句
     *  merge(:学生 {name:"tom",age: 22,serialNumber:"STU0213131"})
     */
    private static final ObjectMapper OBJECT_MAPPER_BY_QUOTE_FIELD_NAMES = new ObjectMapper();
    static {
        OBJECT_MAPPER_BY_QUOTE_FIELD_NAMES
                .configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
    }


    /**
     * map转换成json格式String
     * @param map Map<String,Object>
     * @return String
     */
    public static String map2String(Map<String,Object> map){
        String propertiesString = "";
        try {
            propertiesString = OBJECT_MAPPER_BY_QUOTE_FIELD_NAMES.writeValueAsString(map);
        } catch (JsonProcessingException e) {
            log.error(e.getMessage());
        }
        return propertiesString;
    }







    /**
     * 对象转Json格式字符串
     *
     * @param obj 对象
     * @return Json格式字符串
     */
    public static <T> String obj2String(T obj) {
        if (obj == null) {
            return null;
        }
        try {
            return obj instanceof String ? (String) obj : OBJECT_MAPPER.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            log.warn("Parse Object to String error : {}", e.getMessage());
            return null;
        }
    }

    /**
     * 对象转file
     * @param fileName String
     * @param obj  Object
     */
    public static void obj2File(String fileName,Object obj){
        if (obj == null){
            return;
        }
        try {
            OBJECT_MAPPER.writeValue(new File(fileName),obj);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 对象转Json格式字符串(格式化的Json字符串)
     *
     * @param obj 对象
     * @return 美化的Json格式字符串
     */
    public static <T> String obj2StringPretty(T obj) {
        if (obj == null) {
            return null;
        }
        try {
            return obj instanceof String ? (String) obj : OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            log.warn("Parse Object to String error : {}", e.getMessage());
            return null;
        }
    }

    /**
     * 字符串转换为自定义对象
     *
     * @param str   要转换的字符串
     * @param clazz 自定义对象的class对象
     * @return 自定义对象
     */
    public static <T> T string2Obj(String str, Class<T> clazz) {
        if (StringUtils.isEmpty(str) || clazz == null) {
            return null;
        }
        try {
            return clazz.equals(String.class) ? (T) str : OBJECT_MAPPER.readValue(str, clazz);
        } catch (Exception e) {
            log.warn("Parse String to Object error : {}", e.getMessage());
            return null;
        }
    }

    /**
     * 对象转Json格式字符串; 属性名从驼峰改为下划线形式
     *
     * @param obj 对象
     * @return Json格式字符串
     */
    public static <T> String obj2StringFieldSnakeCase(T obj) {
        if (obj == null) {
            return null;
        }
        try {
            ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE;
            return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            log.warn("Parse Object to String error : {}", e.getMessage());
            return null;
        }
    }

    /**
     * 字符串转换为自定义对象; 属性名从下划线形式改为驼峰
     *
     * @param str   要转换的字符串
     * @param clazz 自定义对象的class对象
     * @return 自定义对象
     */
    public static <T> T string2ObjFieldLowerCamelCase(String str, Class<T> clazz) {
        if (StringUtils.isEmpty(str) || clazz == null) {
            return null;
        }
        try {
            ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE;
            return clazz.equals(String.class) ? (T) str : objectMapper.readValue(str, clazz);
        } catch (Exception e) {
            log.warn("Parse String to Object error : {}", e.getMessage());
            return null;
        }
    }

    /**
     * 字符串转换为自定义对象(List); 属性名从下划线形式改为驼峰
     *
     * @param str           要转换的字符串
     * @param typeReference 自定义对象的typeReference List 对象
     * @return 自定义对象
     */
    public static <T> List<T> string2ListFieldLowerCamelCase(String str, TypeReference<List<T>> typeReference) {
        if (StringUtils.isEmpty(str) || typeReference == null) {
            return null;
        }
        try {
            ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE;
            return objectMapper.readValue(str, typeReference);
        } catch (Exception e) {
            log.warn("Parse String to Object error : {}", e.getMessage());
            return null;
        }
    }





    /**
     * 字符串转换为自定义字段转为list
     * @param str  String
     * @param typeReference   TypeReference
     * @param <T>  泛型
     * @return T   类型
     */
    public static <T> T string2Obj(String str, TypeReference<T> typeReference) {
        if (StringUtils.isEmpty(str) || typeReference == null) {
            return null;
        }
        try {
            return (T) (typeReference.getType().equals(String.class) ? str : OBJECT_MAPPER.readValue(str, typeReference));
        } catch (IOException e) {
            log.warn("Parse String to Object error", e);
            return null;
        }
    }

    public static <T> T string2Obj(String str, Class<?> collectionClazz, Class<?>... elementClazzes) {
        JavaType javaType = OBJECT_MAPPER.getTypeFactory().constructParametricType(collectionClazz, elementClazzes);
        try {
            return OBJECT_MAPPER.readValue(str, javaType);
        } catch (IOException e) {
            log.warn("Parse String to Object error : {}" + e.getMessage());
            return null;
        }
    }
}


在springboot项目中配置全局序列化date返回前端字符串

需要在yml里配置jsckson

spring:
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss

在这里插入图片描述

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

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

相关文章

VRP基础操作

目录 一、华为VRP 1.1、VRP介绍 1.2、设备管理接口 1.3、Console口登录 1.4、参数配置 二、华为VRP命令行基础 2.1、真机设备初始化启动 2.2、命令行视图 2.3、命令行功能 2.4、命令行在线帮助 2.5、配置系统时钟 2.6、配置标题消息 2.7、命令等级 2.8、用户界面…

Apikit 自学日记:使用全局变量传递参数

全局变量可以在测试过程中动态取值以及赋值&#xff0c;比如&#xff1a;使用登录接口获取token&#xff0c;将token值赋值给自定义全局变量 global_token &#xff0c;然后在另一个需要使用该token的接口中&#xff0c;使用{{global_token}}或者代码来引用该全局变量&#xff…

基于深度学习的高精度水下目标检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度水下目标&#xff08;鱼&#xff08;fish&#xff09;、水母&#xff08;jellyfish&#xff09;、企鹅&#xff08;penguin&#xff09;、海鹦&#xff08;puffin&#xff09;、鲨鱼&#xff08;shark&#xff09;、海星&#xff08;starf…

<Windows>《UltraEdit 编辑器之正则表达式(高级查找与替换)》

《UltraEdit 编辑器之正则表达式&#xff08;高级查找与替换&#xff09;》 1 查找和替换时开启正则表达式2 正则表达式关键字3 常用操作3.1 替换空行3.2 替换行尾空格3.3 替换行首空格3.4 替换数字0-93.5 替换空格前内容3.5 替换空行或仅含有空格TAB键的行3.6 末尾加分号 4 其…

PostgreSQL入门教程

目录 一、PostgreSQL安装 1、下载 2、安装 二、PostgreSQL操作 1、数据库操作 2、表操作 3、数据操作 一、PostgreSQL安装 本章节以windows系统安装为例&#xff0c;讲解PostgreSQL 15.0的安装过程。 1、下载 访问PostgreSQL官方网站&#xff0c;下载对应的安装包&am…

phpstudy搭建网站,通过快解析端口映射外网访问

phpstudy是一款集成了apache、mysql、php、ftp等web平台的环境搭建工具&#xff0c;可以让用户轻松搭建测试和开发环境&#xff0c;且不必有过多的配置设置工作。使用phpstudy可以快速搭建出一个本地环境的网站&#xff0c;方便进行调试和开发工作。当然也可以快速搭建部署个人…

Antlr4 语法解析器(下)

Antlr4 的两种AST遍历方式:Visitor方式 和 Listener方式。 Antlr4规则文法: 注释:和Java的注释完全一致,也可参考C的注释,只是增加了JavaDoc类型的注释;标志符:参考Java或者C的标志符命名规范,针对Lexer 部分的 Token 名的定义,采用全大写字母的形式,对于parser rule…

VSCode配置Java环境 全程记录 配置成功| Windows

目录 1 配置电脑Java环境 1.1 下载jdk: 1.2 配置环境变量 1.3 测试Java环境 2. vscode中创建一个Java项目 2.1 创建一个项目根目录 2.2 配置插件 2.3 创建Java项目 1 配置电脑Java环境 1.1 下载jdk: ​​​​​​Java Download | 官网 下载完后双击运行该软件&#xff0c…

kafka入门,文件存储机制(十六)

文件存储机制 1、Topic数据的存储机制 topic是逻辑上的概念&#xff0c;而partition是物理上的概念&#xff0c;每个partition对应一个log文件&#xff0c;该log文件中存储就是Producer生产的数据。Producer生产的数据会不断追加到该log文件末端&#xff0c;为防止log文件过大…

用户标签画像如何建立?用户营销数字化系统推荐

什么是客户管理系统&#xff1f;如蚓链客户管理系统就是基于数字化技术手段&#xff0c;搭配客户标签、客户画像、客户跟进等机制的设计&#xff0c;从而构建可以记录、跟踪和管理公司客户的系统就属于客户管理系统。利用客户管理系统的一系列功能&#xff0c;公司可以真正了解…

Dependency ‘com.google.code.gson:gson:2.10.1‘ not found

当Maven依赖无法导入时&#xff0c;咱们如图操作File->Project Structure 这里输入指定包名之后记得要点击搜索按钮&#xff01;&#xff01;&#xff01; 最后根据搜索结果导入指定包名即可&#xff01; 最后&#xff0c;如果本文对您有帮助&#xff0c;可以给本文点个赞…

[前端]JS语法——检测数据类型typeof

typeof用于检测数据类型&#xff0c;返回以下基本的数据类型&#xff1a; number、string、boolen、undefined、function、object 注意&#xff1a; NaN检测结果为number; 对象、数组、null检测结果为object&#xff1b; 未定义的变量检测结果为undefined. <script>…

2023 中兴捧月算法挑战赛-自智网络-参赛总结

“中兴捧月”是由中兴通讯面向在校大学生举办的全球性系列赛事活动&#xff0c;致力于培养学生建模编程、创新、方案策划和团队合作能力。今年是在学校的宣传下了解到比赛&#xff0c;最初抱着学习的态度报名了比赛&#xff0c;最终进入了决赛&#xff0c;完成了封闭的开发与赛…

MySQL数据库基础(一):数据库安装和DataGrip安装

学习目录 数据库介绍 MySQL数据库安装和使用 SQL语句 DDL之数据库操作 DDL之表操作 DML数据库操作语言 SQL约束 DQL操作 多表操作 学习目标 掌握DDL操作 了解mysql的约束 掌握DML操作 掌握DQL操作 掌握多表联查 一、数据库概述 1、数据库介绍 数据库就是存储数据…

SpringBoot(原理篇)

SpringBoot原理篇 自动配置 bean加载方式 xml方式声明bean 相关类&#xff1a; domain域中的实体类&#xff1a; public class Mouse { }public class Cat { }public class Dog { }测试&#xff1a; public class App1 {public static void main(String[] args) {ClassP…

MyBatis学习笔记--下篇

MyBatis学习笔记–下篇 文章目录 MyBatis学习笔记--下篇1、多对一的处理(关联)1.1、表的创建1.2、实体类1.2、按照查询嵌套处理1.3、按照结果嵌套处理&#xff08;联表查询 &#xff09; 2、一对多的处理&#xff08;Collection&#xff09;2.1、实体类2.2、按结果查询&#xf…

《绝地求生》提示d3dcompiler_47.dll缺失怎么修复win11,三个简易的修复方法

在打开《绝地求生》游戏的时候&#xff0c;报错提示“由于找不到d3dcompiler_47.dll”&#xff0c;“d3dcompiler_47.dll缺失”等问题&#xff0c;都是由于电脑系统的中的d3dcompiler_47.dll文件丢失或者损坏了。d3dcompiler_47.dll 是 Microsoft 的 DirectX 11 核心组件之一&a…

彻底搞懂Linux中10位含义的文件权限以及修改文件权限

彻底搞懂Linux中10位含义的文件权限以及修改文件权限 1. 前言1.1 创建用户及简单权限问题1.2 抛出文件权限问题 2. 第二段&#xff08;连接数&#xff09;3. 第三段&#xff08;所属者&#xff09; 第四段&#xff08;所属组&#xff09;3.1 介绍Linux中的三种角色3.2 更改文件…

Kubernetes删除ns(namespace)

一、前言 删除某个应用或模块的时候&#xff0c;可能会出现命名空间的状态一直处于Terminating状态&#xff0c;无论是重启k8s还是重启所有服务器都没卵用。 k8s遇到有无法删除的ns&#xff08;namespace&#xff09;命名空间的时候&#xff0c;可以尝试几种删除方式 二、删…

zabbix拓扑图主机拓扑的分组设置

目录 一、需求描述 二、实现方法 &#xff08;一&#xff09;第一步 编辑拓扑图 &#xff08;二&#xff09;第二步 编辑形状 &#xff08;三&#xff09;第三步 点“更新” 一、需求描述 在zabbix-监测-拓扑图-服务器拓扑图中&#xff0c;需要按照各业务来分组展示&#…