JsonUtils

news2024/11/28 2:56:37

1、工具类

package com.atguigu.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.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

/**
 * 基于Jackson的JSON转换工具类
 *
 * @author: XuXin
 * @date: 2023/9/18
 */
@Slf4j
public class JsonUtils {
    // 定义jackson对象
    private static final ObjectMapper objectMapper = new ObjectMapper();

    static {
        // 对象的所有字段全部列入,还是其他的选项,可以忽略null等
        objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
        // 设置Date类型的序列化及反序列化格式
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        // 忽略空Bean转json的错误
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        // 忽略未知属性,防止json字符串中存在,java对象中不存在对应属性的情况出现错误
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        // 注册一个时间序列化及反序列化的处理模块,用于解决jdk8中localDateTime等的序列化问题
        objectMapper.registerModule(new JavaTimeModule()
                .addSerializer(LocalDateTime.class,
                        new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
                .addDeserializer(LocalDateTime.class,
                        new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
        );
    }

    /**
     * 对象 => json字符串
     *
     * @param obj 源对象
     */
    public static String format(Object obj) {
        String json = null;
        if (obj != null) {
            try {
                json = objectMapper.writeValueAsString(obj);
            } catch (JsonProcessingException e) {
                log.warn(e.getMessage(), e);
                throw new IllegalArgumentException(e.getMessage());
            }
        }
        return json;
    }

    /**
     * json字符串 => 对象
     *
     * @param jsonStr 源json串
     * @param clazz   对象类
     * @param <T>     泛型
     */
    public static <T> T parse(String jsonStr, Class<T> clazz) {
        return parse(jsonStr, clazz, null);
    }

    /**
     * json字符串 => 对象
     *
     * @param jsonStr 源json串
     * @param type    对象类型
     * @param <T>     泛型
     */
    public static <T> T parse(String jsonStr, TypeReference<T> type) {
        return parse(jsonStr, null, type);
    }

    /**
     * json => 对象处理方法
     * <br>
     * 参数clazz和type必须一个为null,另一个不为null
     * <br>
     * 此方法不对外暴露,访问权限为private
     *
     * @param jsonStr 源json串
     * @param clazz   对象类
     * @param type    对象类型
     * @param <T>     泛型
     */
    private static <T> T parse(String jsonStr, Class<T> clazz, TypeReference<T> type) {
        T obj = null;
        if (!StringUtils.isEmpty(jsonStr)) {
            try {
                if (clazz != null) {
                    obj = objectMapper.readValue(jsonStr, clazz);
                } else {
                    obj = objectMapper.readValue(jsonStr, type);
                }
            } catch (IOException e) {
                log.warn(e.getMessage(), e);
                throw new IllegalArgumentException(e.getMessage());
            }
        }
        return obj;
    }

    public static <T> List<T> json2List(String jsonStr, Class<T> beanType) {
        JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, beanType);
        try {
            List<T> list = objectMapper.readValue(jsonStr, javaType);
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

2、使用

@SpringBootTest
class MybatisplusApplicationTests {
    @Test
    void contextLoads() throws IOException {
        User user = new User();
        user.setName("pp");
        user.setAge(17);
        String s = JsonUtils3.format(user);
        User user1 = JsonUtils3.parse(s, User.class);
        User user2 = JsonUtils3.parse(s, new TypeReference<User>() {});
        Map<String, String> map = JsonUtils3.parse(s, new TypeReference<Map<String, String>>() {});
        String s2 = "[\n" +
                "{\"id\": 1, \"name\": \"John\"},\n" +
                "{\"id\": 2, \"name\": \"Jane\"},\n" +
                "{\"id\": 3, \"name\": \"Bob\"}\n" +
                "]";
        String s3 = "[{\"id\":null,\"name\":\"pp\",\"age\":17,\"email\":null,\"persion\":null}]";
        List<User> users1 = JsonUtils3.json2List(s2, User.class);
        List<User> users2 = JsonUtils3.json2List(s3, User.class);
    }
}

s:
{“id”:null,“name”:“pp”,“age”:17,“email”:null,“persion”:null}
s2:
[
{“id”: 1, “name”: “John”},
{“id”: 2, “name”: “Jane”},
{“id”: 3, “name”: “Bob”}
]
s3:
[{“id”:null,“name”:“pp”,“age”:17,“email”:null,“persion”:null}]
在这里插入图片描述

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

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

相关文章

解决hadoop使用put上传报错问题

hadoop使用put上传报错 WARN hdfs.DataStreamer: DataStreamer Exception org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /input/yxqzdata.COPYING could only be replicated to 0 nodes instead of minReplication (1). There are 0 datanode(s) runnin…

MySQL搭建主从复制集群,实现读写分离

目录 一、准备 二、配置 2.1 配置主库 修改配置文件/etc/my.cnf 重启服务 为主库再创建一个账户并授权 查看状态 2.2 配置从库 修改配置文件/etc/my.cnf 重启mysql服务 配置需要同步的主机 启动salve同步 查看是否同步 三、测试主从复制是否生效 四、读写分离案…

【计算机毕业设计】基于SpringBoot+Vue热门网游推荐网站的设计与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…

C++之va_start、vasprintf、va_end应用总结(二百二十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

腾讯mini项目-【指标监控服务重构】2023-07-29

今日已办 根据导师代码评审的 comment 改进 修改命名 otelclient.otelExporterOtlpEndpoint to otelclient.endpoint禁用 TLS 加密&#xff0c;移除 otelclient.insecureMode避免命名缩写影响代码的阅读理解把两个函数&#xff08;createTraceExp和createTraceProvider&#…

Softing物联网(IoT)方案之OT/IT数据集成

一 利用数据提高效率和绩效 多年以来数据集成和工业物联网一直在推动着市场的发展&#xff0c;目前我们已经能够集成并成功使用先进的技术、大量的传感器和复杂的数据格式等。而在工业物联网或工业4.0中&#xff0c;还有运营技术&#xff08;OT&#xff09;和信息技术&#xf…

会C++还需要再去学Python吗?

提到的C、数据结构与算法、操作系统、计算机网络和数据库技术等确实是计算机科学中非常重要的基础知识领域&#xff0c;对于软件开发和计算机工程师来说&#xff0c;它们是必备的核心知识。掌握这些知识对于开发高性能、可靠和安全的应用程序非常重要。Python作为一种脚本语言&…

Spring Authorization Server入门 (十八) Vue项目使用PKCE模式对接认证服务

Vue单页面项目使用授权码模式对接流程说明 以下流程摘抄自官网 在本例中为授权代码流程。 授权码流程的步骤如下&#xff1a; 客户端通过重定向到授权端点来发起 OAuth2 请求。 对于公共客户端&#xff0c;此步骤包括生成code_verifier 并计算code_challenge&#xff0c;然后…

实验5 跨交换机实现VLAN

交换机端口隔离&#xff08;access模式&#xff09; 实验目的实验拓扑实验步骤&#xff08;1&#xff09;在未划分vlan前&#xff0c;配置pc1、pc2、pc3、pc4的地址&#xff0c;如图所示&#xff08;2&#xff09;测试两台pc机的连通性&#xff08;3&#xff09;在S1中创建vlan…

必看!S3File Sink Connector 使用文档

S3File 是一个用于管理 Amazon S3&#xff08;Simple Storage Service&#xff09;的 Python 模块。当前&#xff0c;Apache SeaTunnel 已经支持 S3File Sink Connector&#xff0c;为了更好地使用这个 Connector&#xff0c;有必要看一下这篇使用文档指南。 描述 将数据输出…

springboot druid多数据源配置,及druid监控

基础配置&#xff1a; springboot2.x版本 jdk1.8 依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version> </dependency> &…

分享一个基于微信小程序的高校图书馆预约座位小程序 图书馆占座小程序源码 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

Linux高性能服务器编程 学习笔记 第五章 Linux网络编程基础API

我们将从以下3方面讨论Linux网络API&#xff1a; 1.socket地址API。socket最开始的含义是一个IP地址和端口对&#xff08;ip&#xff0c;port&#xff09;&#xff0c;它唯一表示了使用TCP通信的一端&#xff0c;本书称其为socket地址。 2.socket基础API。socket的主要API都定…

打开泰坦陨落提示msvcp120.dll丢失怎么办?三个解决方法快速解决

首先&#xff0c;我们来了解一下msvcr120.dll是什么文件。msvcr120.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2013 Redistributable中的一个组件。这个文件对于一些软件的运行是非常重要的&#xff0c;如果缺失或损坏&#xff0c;就会导致软件无法正常运行。…

从淘宝数据分析产品需求(商品销量总销量精准月销)

淘宝数据分析总体来说可以分为商品分析、客户分析、地区分析、时间分析四大维度(参考数据雷达的分析思路)。在这里我重点说商品分析。 在淘宝上开店的竞争还是非常激烈的&#xff0c;随便拿出一个单品就有很多竞品存在&#xff0c;所以做起来还是很难的&#xff0c;而想要在众…

Git:利用Git模拟企业级项目管理

文章目录 基础知识Git分支设计规范master分支release分支develop分支feature分支hotfix分支 模拟进行企业级项目管理 本篇主要总结的是企业级开发模型以及利用Git模拟企业级别的项目管理方式 基础知识 前面已经进行了全部的关于Git的各项操作&#xff0c;那么Git是作用于企业…

<Altium Designer>向PCB导入网表(.NET)

目录 01 AD PCB导入网表(.NET) 添加.NET文件到AD工程 通过show Differences操作导入器件 02 文章总结 大家好&#xff0c;这里是程序员杰克。一名平平无奇的嵌入式软件工程师。 硬件工程师使用的是Cadence的OrCAD画原理图&#xff0c;输出的是.NET网表&#xff0c;而杰克使…

自动化测试---选择框

radio框选择选项&#xff0c;直接用WebElement的click方法&#xff0c;模拟用户点击就可以了。 比如, 我们要在下面的html中&#xff1a; 1.先打印当前选中的老师名字 2.再选择 小雷老师 <div id"s_radio"><input type"radio" name"teach…

在静态方法中访问@Value注入的静态变量!!

一、 静态变量 static修饰的成员变量&#xff0c;称为静态成员变量&#xff0c;静态成员变量最大的特性&#xff1a;不属于某个具体的对象&#xff0c;是所有对象所共享的 简单来说&#xff1a;在某些类的对象中存在一些相同的成员变量&#xff0c;那么这种成员变量就可以设置…

解决VSCode下载速度很慢

这是VSCode的官网&#xff1a; Visual Studio Code - Code Editing. Redefined 按照官网的下载链接&#xff0c;速度实在是感人&#xff01; 解决办法也很简单&#xff0c;把链接换为CDN加速的链接 把下载链接中的az764295.vo.msecnd.net 替换为&#x1f449; vscode.cdn.azu…