重新整理了新版JSON工具类和一些见解

封装好了,工具类,直接粘贴就好了:所需依赖 springboot,hutool

java 复制代码
package com.jmj.gulimall.product.utils;

import cn.hutool.core.bean.BeanUtil;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
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.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.util.StdDateFormat;
import com.jmj.gulimall.product.vo.spu.Attr;
import lombok.*;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class JsonUtils {

    private final static ObjectMapper objectMapper;

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @EqualsAndHashCode(callSuper = true)//不加这个情况下重写的Hashcode和Equals 不会比较父类属性值
    @ToString(callSuper = true)//包括父类
    @JsonIgnoreProperties({"attrValue","attrId","attrName"})//这个注解可以忽略父类属性,不需要spring环境
    public static class Energy extends Attr {
        @JsonIgnore//忽略本类字段
        private String name;
        private Date time;
    }

    public static ObjectMapper instance(DateFormat dateFormat){
        ObjectMapper objectMapper = new ObjectMapper();
        //{"name":"边杰","time":"2024-06-21T10:43:43.480+0000"}
        objectMapper.setDateFormat(dateFormat);//中间没有:号
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);//禁用转换时间戳
        // 序列化时忽略未知属性
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        // 禁用忽略大小写的特性
        objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, false);

        // 设置序列化时不包含空属性
        // objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 不包括null值
        objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); // 全部
        return objectMapper;
    }
    public static ObjectMapper instance(){
        return instance(new StdDateFormat().withColonInTimeZone(false));
    }
    static {
       objectMapper = instance();
    }
    public static DateFormat format(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return simpleDateFormat;
    }

    public static String getJson(Object obj, boolean exIsThrow) {
        try {
            return objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            if (exIsThrow) {
                throw new RuntimeException("JSON解析异常 e=" + e.getMessage());
            } else {
                return null;
            }

        }
    }

    public static String getJson(Object obj) {
        return getJson(obj, false);
    }

    public static <R> R getObj(String json, Class<R> clazz, boolean exIsThrow) {
        try {
            return objectMapper.readValue(json, clazz);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            if (exIsThrow) {
                throw new RuntimeException("JSON解析异常 e=" + e.getMessage());
            } else {
                return null;
            }
        }
    }
    public static <R> R getObj(String json, Class<R> clazz) {
        return getObj(json, clazz, false);
    }

    public static <T> T getObj(String json,TypeReference<T> type, boolean exIsThrow) {
        try {
            return objectMapper.readValue(json, type);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            if (exIsThrow) {
                throw new RuntimeException("JSON解析异常 e=" + e.getMessage());
            } else {
                return null;
            }
        }

    }

    public static <T> T getObj(String json,TypeReference<T> type) {
        return getObj(json, type,false);
    }


    public static void main(String[] args) throws JsonProcessingException {
//        List<Energy> list = Arrays.asList(new Energy("边界", new Date()), new Energy("边界", new Date()), new Energy("边界", new Date()));
//        String s = getJson(list);
//        System.out.println(s);
//        List<Energy> energy = getObj("[{\"attrId\":\"123\",\"attrName\":null,\"name\":\"边界\",\"time\":\"2024-06-21T11:59:00.118+0000\"},{\"attrId\":null,\"attrName\":null,\"name\":\"边界\",\"time\":\"2024-06-21T11:59:00.118+0000\"},{\"attrId\":null,\"attrName\":null,\"name\":\"边界\",\"time\":\"2024-06-21T11:59:00.118+0000\"}]",
//                new TypeReference<List<Energy>>() {},true);
//        System.out.println(energy);

//        System.out.println(instance(format()).writeValueAsString(list));


        Energy energy = new Energy("边界", new Date());
        energy.setAttrId(123L);
        energy.setAttrName("a");
        energy.setAttrValue("as");

        System.out.println(getJson(energy));
        
        
        Attr attr = new Attr();
        //父类属性也会Copy过来
        BeanUtil.copyProperties(energy,attr);
        System.out.println(attr);

    }


}
相关推荐
糖猫猫cc4 分钟前
Kite 实现逻辑删除
java·kotlin·orm·kite
王小义笔记5 分钟前
大模型微调步骤与精髓总结
python·大模型·llm
Memory_荒年5 分钟前
Dubbo调优实战:从QPS 1000到10000的惊险过山车之旅
java·后端·dubbo
Cosolar7 分钟前
别再羡慕 Python 了!Java 开发者的 AI Agent 全指南:四大框架从选型到实战
java·人工智能·后端
色空大师17 分钟前
网站搭建实操(三)后台管理-2-forum-core)
java·redis·网站·搭建网站
Memory_荒年19 分钟前
Dubbo高级实战:从“能用”到“好用”的奇技淫巧
java·后端
Flittly30 分钟前
【SpringAIAlibaba新手村系列】(4)流式输出与响应式编程
java·spring boot·spring·ai
yangyanping201081 小时前
广告系统设计二之RTA系统设计
java·spring·mybatis
刘 大 望1 小时前
开发自定义MCP Server并部署
java·spring·ai·语言模型·aigc·信息与通信·ai编程
源码之家1 小时前
计算机毕业设计:Python汽车销量数据采集分析可视化系统 Flask框架 requests爬虫 可视化 车辆 大数据 机器学习 hadoop(建议收藏)✅
大数据·爬虫·python·django·flask·课程设计·美食