# 好用的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>
```
[參考網站](https://www.uj5u.com/qita/263396.html)
萬用的JSONUtils
```java=\
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
以下是練習:
```java=\
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
```java=\
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