首页 > 其他分享 >【工具类】JacksonUtils

【工具类】JacksonUtils

时间:2023-08-18 13:44:14浏览次数:34  
标签:MAPPER return param json static new JacksonUtils 工具

 

package com.ryxx.util;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.jsontype.NamedType;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.ser.std.DateSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

@SuppressWarnings("unused")
@Slf4j
public final class JacksonUtils {


    private static final String pattern = "yyyy-MM-dd HH:mm:ss.SSS";

    private static final String timeZoneString = "Asia/Shanghai";

    private static final ObjectMapper MAPPER = new ObjectMapper();

    private static final String SERIALIZATION_ERROR_MESSAGE = JacksonUtils.class.getName() + ": Serialize error.";

    private static final String DESERIALIZATION_ERROR_MESSAGE = JacksonUtils.class.getName() + ": Deserialize error.";


    static {
        // POJO对象的属性值不论是什么,序列化时都显示
        MAPPER.setSerializationInclusion(JsonInclude.Include.ALWAYS);
        // 设置在反序列化时忽略在JSON字符串中存在,而在Java中不存在的属性
        MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        // 设置序列化时间类型不使用时间戳形式(jackson时间类型默认都是序列化为时间戳形式的)
        MAPPER.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        // 为了处理JSON中的日期字符串并正确转换为 LocalDate,我们需要注册在 ObjectMapper 实例中注册 JavaTimeModule 模块。
        // 还需要禁止把日期转换为时间戳字符串的动作
        JavaTimeModule javaTimeModule = new JavaTimeModule();

        // Date类型序列化、反序列化全局配置-方式1
//        MAPPER.setDateFormat(new SimpleDateFormat(pattern));

        // Date类型序列化、反序列化全局配置-方式2
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        simpleDateFormat.setTimeZone(TimeZone.getTimeZone(timeZoneString));
        javaTimeModule.addSerializer(Date.class, new DateSerializer(false, simpleDateFormat));
        javaTimeModule.addDeserializer(Date.class, new DateDeserializer());

        // LocalDateTime类型序列化、反序列化全局配置
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern)));
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(pattern)));

        MAPPER.registerModule(javaTimeModule);

    }

    /**
     * Object to json string.
     *
     * @param obj obj
     * @return json string
     */
    public static String toJson(Object obj) {
        try {
            return MAPPER.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(SERIALIZATION_ERROR_MESSAGE, e);
        }
    }

    /**
     * Object to json string byte array.
     *
     * @param obj obj
     * @return json string byte array
     */
    public static byte[] toJsonBytes(Object obj) {
        try {
            return MAPPER.writeValueAsBytes(obj);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(SERIALIZATION_ERROR_MESSAGE, e);
        }
    }

    /**
     * Json string deserialize to Object.
     *
     * @param json json string
     * @param cls  class of object
     * @param <T>  General type
     * @return object
     */
    public static <T> T toObj(byte[] json, Class<T> cls) {
        try {
            return MAPPER.readValue(json, cls);
        } catch (Exception e) {
            throw new RuntimeException(DESERIALIZATION_ERROR_MESSAGE, e);
        }
    }

    /**
     * Json string deserialize to Object.
     *
     * @param json json string
     * @param cls  {@link Type} of object
     * @param <T>  General type
     * @return object
     */
    public static <T> T toObj(byte[] json, Type cls) {
        try {
            return MAPPER.readValue(json, constructJavaType(cls));
        } catch (Exception e) {
            throw new RuntimeException(DESERIALIZATION_ERROR_MESSAGE, e);
        }
    }

    /**
     * Json string deserialize to Object.
     *
     * @param inputStream json string input stream
     * @param cls         class of object
     * @param <T>         General type
     * @return object
     */
    public static <T> T toObj(InputStream inputStream, Class<T> cls) {
        try {
            return MAPPER.readValue(inputStream, cls);
        } catch (IOException e) {
            throw new RuntimeException(DESERIALIZATION_ERROR_MESSAGE, e);
        }
    }

    /**
     * Json string deserialize to Object.
     *
     * @param json          json string byte array
     * @param typeReference {@link TypeReference} of object
     * @param <T>           General type
     * @return object
     */
    public static <T> T toObj(byte[] json, TypeReference<T> typeReference) {
        try {
            return MAPPER.readValue(json, typeReference);
        } catch (Exception e) {
            throw new RuntimeException(DESERIALIZATION_ERROR_MESSAGE, e);
        }
    }

    /**
     * Json string deserialize to Object.
     *
     * @param json json string
     * @param cls  class of object
     * @param <T>  General type
     * @return object
     */
    public static <T> T toObj(String json, Class<T> cls) {
        try {
            return MAPPER.readValue(json, cls);
        } catch (IOException e) {
            throw new RuntimeException(DESERIALIZATION_ERROR_MESSAGE, e);
        }
    }

    /**
     * Json string deserialize to Object.
     *
     * @param json json string
     * @param type {@link Type} of object
     * @param <T>  General type
     * @return object
     */
    public static <T> T toObj(String json, Type type) {
        try {
            return MAPPER.readValue(json, MAPPER.constructType(type));
        } catch (IOException e) {
            throw new RuntimeException(DESERIALIZATION_ERROR_MESSAGE, e);
        }
    }

    /**
     * Json string deserialize to Object.
     *
     * @param json          json string
     * @param typeReference {@link TypeReference} of object
     * @param <T>           General type
     * @return object
     */
    public static <T> T toObj(String json, TypeReference<T> typeReference) {
        try {
            return MAPPER.readValue(json, typeReference);
        } catch (IOException e) {
            throw new RuntimeException(DESERIALIZATION_ERROR_MESSAGE, e);
        }
    }

    /**
     * Json string deserialize to Object.
     *
     * @param inputStream json string input stream
     * @param type        {@link Type} of object
     * @param <T>         General type
     * @return object
     */
    public static <T> T toObj(InputStream inputStream, Type type) {
        try {
            return MAPPER.readValue(inputStream, MAPPER.constructType(type));
        } catch (IOException e) {
            throw new RuntimeException(DESERIALIZATION_ERROR_MESSAGE, e);
        }
    }

    /**
     * Json string deserialize to Jackson {@link JsonNode}.
     *
     * @param json json string
     * @return {@link JsonNode}
     */
    public static JsonNode readTree(String json) {
        try {
            return MAPPER.readTree(json);
        } catch (IOException e) {
            throw new RuntimeException(DESERIALIZATION_ERROR_MESSAGE, e);
        }
    }

    /**
     * Register subtype for child class.
     *
     * @param clz  child class
     * @param type type name of child class
     */
    public static void registerSubtype(Class<?> clz, String type) {
        MAPPER.registerSubtypes(new NamedType(clz, type));
    }

    /**
     * Create a new empty Jackson {@link ObjectNode}.
     *
     * @return {@link ObjectNode}
     */
    public static ObjectNode createEmptyJsonNode() {
        return new ObjectNode(MAPPER.getNodeFactory());
    }

    /**
     * Create a new empty Jackson {@link ArrayNode}.
     *
     * @return {@link ArrayNode}
     */
    public static ArrayNode createEmptyArrayNode() {
        return new ArrayNode(MAPPER.getNodeFactory());
    }

    /**
     * Parse object(usually a bean) to Jackson {@link JsonNode}.
     *
     * @param obj object
     * @return {@link JsonNode}
     */
    public static JsonNode transferToJsonNode(Object obj) {
        return MAPPER.valueToTree(obj);
    }

    /**
     * construct java type -> Jackson Java Type.
     *
     * @param type java type
     * @return JavaType {@link JavaType}
     */
    public static JavaType constructJavaType(Type type) {
        return MAPPER.constructType(type);
    }

    public static ObjectMapper getObjectMapper() {
        return MAPPER;
    }


    /**
     * Date类型反序列化定制
     */
    public static class DateDeserializer extends JsonDeserializer<Date> {

        private static final List<String> patternList = new ArrayList<String>(4);

        static {
            patternList.add("yyyy-MM");
            patternList.add("yyyy-MM-dd");
            patternList.add("yyyy-MM-dd hh:mm");
            patternList.add("yyyy-MM-dd hh:mm:ss");
            patternList.add("yyyy-MM-dd hh:mm:ss.SSS");
        }

        @Override
        public Date deserialize(JsonParser p, DeserializationContext ctxt)
                throws IOException, JsonProcessingException {
            String source = p.getText().trim();
            if ("".equals(source)) {
                return null;
            }

            if (source.matches("^\\d{4}-\\d{1,2}$")) {
                return parseDate(source, patternList.get(0));
            } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {
                return parseDate(source, patternList.get(1));
            } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {
                return parseDate(source, patternList.get(2));
            } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
                return parseDate(source, patternList.get(3));
            } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}.\\d{1,3}$")) {
                return parseDate(source, patternList.get(4));
            } else if (source.matches("^\\d{13}$")) {//毫秒
                return new Date(Long.parseLong(source));
            } else if (source.matches("^\\d{10}$")) {//秒
                return new Date(Long.parseLong(source) * 1000);
            } else {
                throw new IllegalArgumentException("Invalid Date value '" + source + "'");
            }

        }

        /**
         * 功能描述:格式化日期
         *
         * @param dateStr String 字符型日期
         * @param format  String 格式
         * @return Date 日期
         */
        private Date parseDate(String dateStr, String format) {
            Date date = null;
            try {
                DateFormat dateFormat = new SimpleDateFormat(format);
                date = dateFormat.parse(dateStr);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return date;
        }

    }

}

 

标签:MAPPER,return,param,json,static,new,JacksonUtils,工具
From: https://www.cnblogs.com/ryxxtd/p/17640260.html

相关文章

  • shell 学习之文本处理工具
    视频:07_小工具使用diff【正常模式】_哔哩哔哩_bilibili1.grep 2.cut 3.sort  4.uniq 5.tee从标准输入读取并写到标准输出和文件,即双向覆盖重定向(屏幕输出/文本输入)。 6.diff 逐行比较文件的不同。 语法:diff[选项]file1file2 1)正常显示......
  • accesskey_tools:一款针对云环境的多功能利用脚本工具
    一、 关于accesskey_tools"accesskey_tools"是一个基于Python开发的多平台云环境利用辅助脚本。该工具可用于渗透测试中,因开发的不规范,以及一些其它漏洞,拿到泄漏AK/SK的情况下,测试人员可以直接利用这些凭证对云服务器进行测试,及时修复风险并采取相应措施,确保云环境中的敏感凭......
  • 指定或降低Rust 工具链的版本
    要更改Rust工具链的版本,您可以使用以下命令之一:rustupdefaultstable:使用stable版本的Rust工具链作为默认版本。rustupdefaultbeta:使用beta版本的Rust工具链作为默认版本。rustupdefaultnightly:使用nightly版本的Rust工具链作为默认版本。除了default命令,还......
  • java开发工具idea连接aws账号管理
    一:下载插件awstoolkit二:登录亚马逊账号拿到密钥信息三:设置idea连接地区配置idea连接信息aws密钥重启idea左下侧可用 下载aws插件  配置亚马逊区域选择这个必须和账号配对(一致地区) 去亚马逊官网获取密钥信息     这些都配置完后重启......
  • 在Android Studio中统计代码行数可以通过插件或者内置的工具来实现。以下是两种常用的
    在AndroidStudio中统计代码行数可以通过插件或者内置的工具来实现。以下是两种常用的方法:**方法一:使用插件:**1.打开AndroidStudio,点击顶部菜单中的"File"(文件)。2.选择"Settings"(设置)或"Preferences"(首选项),然后在弹出的窗口中选择"Plugins"(插件)。3.在搜索框中输入"Code......
  • MySQL客户端工具 phpMyAdmin MySQL Workbench HeidiSQL Sequel Pro DBeaver
    MySQL是一种流行的关系型数据库管理系统,它被广泛用于Web应用程序和企业级应用程序的开发中。目前,市面上有不少好用的MySQL客户端工具,如Navicat,SQLyog等。但这些产品虽然功能强大,却都是收费的,而且费用还不低。幸运的是,收费产品并不是你的唯一选择,目前也有不少开源的工具。如果你不想......
  • 虹科干货|一份选择微服务监控工具的指北
    毋庸置疑,监控是管理任何微服务架构的一个关键方面。但是如何为业务选择最佳的微服务监控工具呢?有哪些微服务监控工具?这些工具有什么功能?这里一份参考指北供你参阅。监控您的期望监控哪些内容?在选择工具之前,请考虑一下您购买工具的动机。您的团队应该讨论“我们试图解决或预防哪些问......
  • 虹科干货|一份选择微服务监控工具的指北
    毋庸置疑,监控是管理任何微服务架构的一个关键方面。但是如何为业务选择最佳的微服务监控工具呢?有哪些微服务监控工具?这些工具有什么功能?这里一份参考指北供你参阅。监控您的期望监控哪些内容?在选择工具之前,请考虑一下您购买工具的动机。您的团队应该讨论“我们试图解决或预防......
  • 开源项目自荐:截图工具(小、快、功能丰富)
    我最近开发了一款截图程序,在GitHub开源:https://github.com/xland/ScreenCapture​基础的功能该有的都有了,而且有些功能还更好,大家想要什么功能可以提Issue,我看响应的人多,我就做。当然如果发现了BUG,也请提Issue,谢谢啦。下面是这个程序的一些特性:多屏幕截图、跨屏幕截图画椭圆......
  • GoLand 2023(GO语言集成开发工具环境)mac版
    GoLand是一个非常简单的Go语言开发工具,它使您能够在各种平台上构建Go应用程序。在过去的几年里,GoLand2023在各个领域进行了改进,并且继续发展。我们从这篇文章开始,以了解GoLand的新功能。GoLand的一个很棒的功能是允许您设置源代码,而不仅仅是编译它。这使您可以在编写代码之前......