JacksonUtils - 封装基于 jackson 的 json 转换逻辑代码

发布时间 2023-11-29 17:38:16作者: Nihaorz
JacksonUtils.java
package org.example.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * jackson 工具类
 */
public class JacksonUtils {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 八大基本数据类型
     */
    private static final List<Class> baseType = Arrays.asList(new Class[]{Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class, Character.class, Boolean.class});

    /**
     * 对象转 json,用于引用类型,包括 json 格式的字符串
     *
     * @param obj
     * @return
     * @throws JsonProcessingException
     */
    public static String toJson(Object obj) throws JsonProcessingException {
        toJsonCheckType(obj);
        if (obj instanceof String) {
            obj = toJsonNode((String) obj);
            return obj.toString();
        }
        return objectMapper.writeValueAsString(obj);
    }

    /**
     * 对象转 json,保留缩进,用于引用类型,包括 json 格式的字符串
     *
     * @param obj
     * @return
     * @throws JsonProcessingException
     */
    public static String toPrettyJson(Object obj) throws JsonProcessingException {
        toJsonCheckType(obj);
        if (obj instanceof String) {
            obj = toJsonNode((String) obj);
            return ((JsonNode) obj).toPrettyString();
        }
        return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
    }

    /**
     * toJson 检测,null 和 八大基本数据类型检测
     *
     * @param obj
     */
    private static void toJsonCheckType(Object obj) {
        if (obj == null) {
            throw new RuntimeException("obj -> null, 不支持转换为 json");
        }
        if (baseType.contains(obj.getClass())) {
            throw new RuntimeException(String.format("obj -> %s, %s 类型不支持转换为 json", obj, obj.getClass().getSimpleName()));
        }
    }

    /**
     * json 转对象
     *
     * @param json
     * @param clazz
     * @param <T>
     * @return
     * @throws JsonProcessingException
     */
    public static <T> T toObject(String json, Class<T> clazz) throws JsonProcessingException {
        return objectMapper.readValue(json, clazz);
    }

    /**
     * json 转集合
     *
     * @param json
     * @param clazz
     * @param <T>
     * @return
     * @throws JsonProcessingException
     */
    public static <T> List<T> toList(String json, Class<T> clazz) throws JsonProcessingException {
        JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, clazz);
        return objectMapper.readValue(json, javaType);
    }

    /**
     * json 字符串转 JsonNode,即 JsonObject
     *
     * @param json
     * @return
     * @throws JsonProcessingException
     */
    public static JsonNode toJsonNode(String json) throws JsonProcessingException {
        JsonNode jsonNode = objectMapper.readTree(json);
        if (!jsonNode.isObject() && !jsonNode.isArray()) {
            throw new RuntimeException("json -> " + json + ", 不是合法的 Json 或 JsonArray");
        }
        return jsonNode;
    }

    /**
     * json 字符串转 JsonNode 集合,即 JsonObject 集合
     *
     * @param json
     * @return
     * @throws JsonProcessingException
     */
    public static List<JsonNode> toJsonNodeList(String json) throws JsonProcessingException {
        List<JsonNode> list = new ArrayList<>();
        JsonNode jsonNode = toJsonNode(json);
        if (jsonNode.isArray()) {
            jsonNode.iterator().forEachRemaining(e -> list.add(e));
        } else {
            throw new RuntimeException("json -> " + json + ", 不是合法的 ArrayNode");
        }
        return list;
    }

    /**
     * json 字符串转 ObjectNode,即 JsonObject
     *
     * @param json
     * @return
     * @throws JsonProcessingException
     */
    public static ObjectNode toObjectNode(String json) throws JsonProcessingException {
        JsonNode jsonNode = toJsonNode(json);
        if (jsonNode.isObject()) {
            return (ObjectNode) jsonNode;
        }
        throw new RuntimeException("json -> " + json + ", 不是合法的 ObjectNode");
    }

    /**
     * json 字符串转 ArrayNode,即 JsonArray
     *
     * @param json
     * @return
     * @throws JsonProcessingException
     */
    public static ArrayNode toArrayNode(String json) throws JsonProcessingException {
        JsonNode jsonNode = toJsonNode(json);
        if (jsonNode.isArray()) {
            return (ArrayNode) jsonNode;
        }
        throw new RuntimeException("json -> " + json + ", 不是合法的 ArrayNode");
    }

}