Try   HackMD

好用的Jackson , 做一個POJO 和 JSON轉換的JSONUtils

Jackson是比較主流的基于Java的JSON類別庫,可用于Json和XML與JavaBean之間的序列化和反序列化,

沒看錯,Jackson也可以處理JavaBean與XML之間的轉換,基于jackson-dataformat-xml組件,而且比較JDK自帶XML實作更加高效和安全,而我們使用比較多的是處理JSON與JavaBean之間的功能,

Jackson主流到什么程度?單從Maven倉庫中的統計來看,Jackson的使用量排位第一,而Spring Boot支持的三個JSON庫(Gson、Jackson、JSON-B)中,Jackson是首選默認庫,

Jackson也有以下特點:依賴少,簡單易用,決議大Json速度快、記憶體占用比較低、擁有靈活的API、方便擴展與定制,

Jackson類別庫GitHub地址:https://github.com/FasterXML/jackson

Jackson的組成部分
Jackson的核心模塊由三部分組成(從Jackson 2.x開始):jackson-core、jackson-annotations、jackson-databind,

jackson-core:核心包,定義了低級流(Streaming)API,提供基于"流模式"決議,Jackson內部實作正是通過高性能的流模式API的JsonGenerator和JsonParser來生成和決議json,
jackson-annotations,注解(Annotations)包,提供標準的Jackson注解功能;
jackson-databind:資料系結(Databind)包,實作了資料系結(和物件序列化)支持,它依賴于Streaming和Annotations包,提供基于“物件系結”決議的API(ObjectMapper)和"樹模型"決議的API(JsonNode);基于"物件系結"決議的API和"樹模型"決議的API依賴基于“流模式”決議的API,
下面看一下不同環境下相關組件的依賴引入情況,

在SpringBoot當中,spring-boot-starter-web間接引入了Jackson組件,也就是如果你使用了SpringBoot框架,那么你的專案中已經有了Jackson依賴,下面的依賴省略了version和scope項

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

參考網站

萬用的JSONUtils

package com.camiol.utils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;


public class JSONUtils {
    private static final Logger log = LogManager.getLogger(JSONUtils.class);

    /**
     * 將物件轉成JSon String
     * @param value
     * @return
     */
    public static String toJSONString(Object value)
    {
        try
        {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.writeValueAsString(value);
        }
        catch (JsonProcessingException e)
        {
            log.info("toJSONString fail, Object=" + value, e);
            return null;
        }
    }

    /**
     * 將JSon String轉成物件
     * @param jsonString
     * @param object
     * @return
     */
    public static <T> T fromJSONString(String jsonString, Class<T> object)
    {
        if (jsonString == null || object == null)
        {
            log.warn("fromJSONString format error");
            return null;
        }

        try
        {
            ObjectMapper mapper = new ObjectMapper();
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
            return mapper.readValue(jsonString, object);
        }
        catch (JsonProcessingException e)
        {
            log.info("fromJSONString fail, jsonString=" + jsonString + ", object=" + object, e);
            return null;
        }
    }

    /**
     * 將Map<String, Object>轉成JSon String
     *
     */
    public static String readMapToJSON(Map<String, Object> map)
    {
        if (map == null || map.isEmpty() )
        {
            log.warn("readMaptoJSON format error");
            return null;
        }

        try
        {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.writeValueAsString(map);
        }
        catch (JsonProcessingException e)
        {
            log.info("readMaptoJSON fail, map= " + map, e);
            return null;
        }
    }
    
    /**
     * 將JSon String轉成Map<String, Object>
     * 
     */
    public static Map<String, Object> readJSONtoMap(String jsonString)
    {
        if (jsonString == null || jsonString.trim().length() == 0)
        {
            log.warn("readJSONtoMap format error");
            return null;
        }

        try
        {
            ObjectMapper mapper = new ObjectMapper();
            TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>(){};
            return mapper.readValue(jsonString, typeRef);
        }
        catch (JsonProcessingException e)
        {
            log.info("readJSONtoMap fail, jsonString=" + jsonString, e);
            return null;
        }
    }
    
    
    /**
     * 將List<Object>轉成JSon String
     * 
     */
    public static String readListToJSON(List<Object> list)
    {
        if (list == null || list.isEmpty() )
        {
            log.warn("readListToJSON format error");
            return null;
        }

        try
        {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.writeValueAsString(list);
        }
        catch (JsonProcessingException e)
        {
            log.info("readListToJSON fail, list=" + list, e);
            return null;
        }
    }
    
    /**
     * 將JSon String轉成 List<Object>
     * 
     */
    public static List< Object> readJSONtoList(String jsonString)
    {
        if (jsonString == null || jsonString.trim().length() == 0)
        {
            log.warn("readJSONtoList format error");
            return null;
        }

        try
        {
            ObjectMapper mapper = new ObjectMapper();
            TypeReference<List< Object>> typeRef = new TypeReference<List< Object>>(){};
            return mapper.readValue(jsonString, typeRef);
        }
        catch (JsonProcessingException e)
        {
            log.info("readJSONtoList fail, jsonString=" + jsonString, e);
            return null;
        }
    }
     
}

使用的時候,可以自由的將map組成JSON字串,或將JSON字串轉成POJO

以下是練習:

 public static void main(String[] args) {
        HashMap<String, Object> map = new HashMap<String, Object>();
        
        map.put("date", "20220722");
        map.put("revers", "false");
        
        HashMap<String, Object> details = new HashMap<String, Object>();
        details.put("assetId", "khr#nbc");
        details.put("currency", "KHR");

        HashMap<String, Object> sourceOfFunds = new HashMap<String, Object>();
        sourceOfFunds.put("phoneNumber", "0975123456");
        sourceOfFunds.put("name", null);
        details.put("sourceOfFunds", sourceOfFunds);
        
        map.put("details",details);
        
        String json = JSONUtils.readMapToJSON(map);
        System.out.println(json);
        
        TransactionContent content = JSONUtils.fromJSONString(json, TransactionContent.class);
        
        System.out.println(content);
        
    }

把JSON轉出來的List<Object>轉成自己要的POJO

List<Bank> resultList = new ArrayList<>();
List<Object> jList = JSONUtils.readJSONtoList(respBody);

if(jList != null && !jList.isEmpty()) {
    for(Object obj : jList) {
        Bank b = JSONUtils.fromJSONString(JSONUtils.toJSONString(obj), Bank.class);

        resultList.add(b);
    }
}
tags: java