JsonUtil


package com.zkml.common.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 java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @Description : 自定义工具类(逐步完善)
 * @Author :zhaojun
 * @Time :2019-04-22 14:12
 */
public final class JsonUtil {

    /**
     * 单例 ObjectMapper
     */
    private final static ObjectMapper objectMapper = new ObjectMapper();

    static {
        // 全部字段序列化
        //对象的所有字段全部列入
        objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
        //取消默认转换timestamps形式
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
        //允许非引号字段名
        objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
        //所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss
        objectMapper.setDateFormat(new SimpleDateFormat(DateUtil.DATE_FORMAT));
        //忽略空Bean转json的错误
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        //忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

    /**
     * 返回json串
     *
     * @param obj
     * @return
     */
    public static String getJsonString(Object obj) {
        if (null == obj || isPrimitive(obj) || obj instanceof String) {
            return String.valueOf(obj);
        }
        String str = null;
        try {
            str = objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return str;
    }

    /**
     * json转换成对象
     *
     * @param json
     * @param tClass
     * @param <E>
     * @return
     */
    public static <E> E jsonToObject(String json, Class<E> tClass) {
        E obj = null;
        try {
            obj = objectMapper.readValue(json, tClass);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return obj;
    }

    /**
     * json转HashMap
     *
     * @param json
     * @return
     */
    public static HashMap jsonToMap(String json) {
        HashMap map = null;
        try {
            map = objectMapper.readValue(json, HashMap.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return map;
    }

    /**
     * object转map
     *
     * @param obj
     * @return
     */
    public static Map objectToMap(Object obj) {
        return jsonToMap(getJsonString(obj));
    }

    /**
     * map转Object
     *
     * @param map
     * @param tClass
     * @param <E>
     * @return
     */
    public static <E> E mapToObject(Map map, Class<E> tClass) {
        return jsonToObject(getJsonString(map), tClass);
    }

    /**
     * mapList转List
     *
     * @param mapList
     * @param tClass
     * @param <E>
     * @return
     */
    public static <E> List<E> mapListToObjectList(List<Map> mapList, Class<E> tClass) {
        return jsonToObject(getJsonString(mapList), List.class, tClass);
    }

    /**
     * 字段符转List之类的集合
     *
     * @param json
     * @param typeReference
     * @return
     */
    public static <E> E jsonToObject(String json, TypeReference typeReference) {
        E obj = null;
        try {
            obj = objectMapper.readValue(json, typeReference);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return obj;
    }

    /**
     * 字段符转集合类
     *
     * @param json
     * @param collectionClass 比如 List.class
     * @param elementClasses  比如  User.class
     * @return
     */
    public static <E> E jsonToObject(String json, Class<?> collectionClass, Class<?>... elementClasses) {
        JavaType javaType = objectMapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
        E obj = null;
        try {
            obj = objectMapper.readValue(json, javaType);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return obj;
    }

    /**
     * 验证是否是基本数据类型
     * @param obj 类对象
     * @return  true基本数据  false不是
     */
    private static boolean isPrimitive(Object obj) {
        try {
            return ((Class<?>)obj.getClass().getField("TYPE").get(null)).isPrimitive();
        } catch (Exception e) {
            return false;
        }
    }
}


posted @ 2020-07-13 20:46  荭丶尘  阅读(88)  评论(0编辑  收藏  举报