使用Jackson封裝常用的JsonUtil工具類方式
更新時間:2025年06月29日 13:24:29 作者:yuhuofei2021
這篇文章主要介紹了使用Jackson封裝常用的JsonUtil工具類方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
在實際開發(fā)中,我們對于 JSON 數據的處理,通常有這么幾個第三方工具包可以使用:
- gson:谷歌的
- fastjson:阿里巴巴的
- jackson:美國FasterXML公司的,Spring框架默認用的
由于以前一直用習慣了阿里的 fastjson,最近突然改為 jackson ,不是太習慣,所以手寫一個工具類,應付一下工作中常用的一些方法。
1. 引入依賴包
在 pom.xml 文件中加入以下依賴
<!-- 引入jackson依賴包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.2</version>
</dependency>
2. 編寫 JsonUtil 工具類
package com.yuhuofei.utils;
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.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
/**
* @Description 由于習慣了用fastjson處理JSON數據,突然改成用jackson,有些不適應,所以打算用jackson封裝出類似fastjson里的方法進行使用
* @ClassName JsonUtil
* @Author yuhuofei
* @Date 2023/8/19 14:36
* @Version 1.0
*/
@Slf4j
public class JsonUtil {
private static ObjectMapper objectMapper = new ObjectMapper();
// 時間日期格式
private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss";
//以靜態(tài)代碼塊初始化
static {
//對象的所有字段全部列入序列化
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
//取消默認轉換timestamps形式
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//忽略空Bean轉json的錯誤
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
//所有的日期格式都統(tǒng)一為以下的格式,即yyyy-MM-dd HH:mm:ss
objectMapper.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT));
//忽略 在json字符串中存在,但在java對象中不存在對應屬性的情況。防止錯誤
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
/**===========================以下是從JSON中獲取對象====================================*/
public static <T> T parseObject(String jsonString, Class<T> object) {
T t = null;
try {
t = objectMapper.readValue(jsonString, object);
} catch (JsonProcessingException e) {
log.error("JsonString轉為自定義對象失敗:{}", e.getMessage());
}
return t;
}
public static <T> T parseObject(File file, Class<T> object) {
T t = null;
try {
t = objectMapper.readValue(file, object);
} catch (IOException e) {
log.error("從文件中讀取json字符串轉為自定義對象失敗:{}", e.getMessage());
}
return t;
}
//將json數組字符串轉為指定對象List列表或者Map集合
public static <T> T parseJSONArray(String jsonArray, TypeReference<T> reference) {
T t = null;
try {
t = objectMapper.readValue(jsonArray, reference);
} catch (JsonProcessingException e) {
log.error("JSONArray轉為List列表或者Map集合失敗:{}", e.getMessage());
}
return t;
}
/**=================================以下是將對象轉為JSON=====================================*/
public static String toJSONString(Object object) {
String jsonString = null;
try {
jsonString = objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
log.error("Object轉JSONString失?。簕}", e.getMessage());
}
return jsonString;
}
public static byte[] toByteArray(Object object) {
byte[] bytes = null;
try {
bytes = objectMapper.writeValueAsBytes(object);
} catch (JsonProcessingException e) {
log.error("Object轉ByteArray失敗:{}", e.getMessage());
}
return bytes;
}
public static void objectToFile(File file, Object object) {
try {
objectMapper.writeValue(file, object);
} catch (JsonProcessingException e) {
log.error("Object寫入文件失?。簕}", e.getMessage());
} catch (IOException e) {
e.printStackTrace();
}
}
/**=============================以下是與JsonNode相關的=======================================*/
//JsonNode和JSONObject一樣,都是JSON樹形模型,只不過在jackson中,存在的是JsonNode
public static JsonNode parseJSONObject(String jsonString) {
JsonNode jsonNode = null;
try {
jsonNode = objectMapper.readTree(jsonString);
} catch (JsonProcessingException e) {
log.error("JSONString轉為JsonNode失?。簕}", e.getMessage());
}
return jsonNode;
}
public static JsonNode parseJSONObject(Object object) {
JsonNode jsonNode = objectMapper.valueToTree(object);
return jsonNode;
}
public static String toJSONString(JsonNode jsonNode) {
String jsonString = null;
try {
jsonString = objectMapper.writeValueAsString(jsonNode);
} catch (JsonProcessingException e) {
log.error("JsonNode轉JSONString失敗:{}", e.getMessage());
}
return jsonString;
}
//JsonNode是一個抽象類,不能實例化,創(chuàng)建JSON樹形模型,得用JsonNode的子類ObjectNode,用法和JSONObject大同小異
public static ObjectNode newJSONObject() {
return objectMapper.createObjectNode();
}
//創(chuàng)建JSON數組對象,就像JSONArray一樣用
public static ArrayNode newJSONArray() {
return objectMapper.createArrayNode();
}
/**===========以下是從JsonNode對象中獲取key值的方法,個人覺得有點多余,直接用JsonNode自帶的取值方法會好點,出于糾結癥,還是補充進來了*/
public static String getString(JsonNode jsonObject, String key) {
String s = jsonObject.get(key).asText();
return s;
}
public static Integer getInteger(JsonNode jsonObject, String key) {
Integer i = jsonObject.get(key).asInt();
return i;
}
public static Boolean getBoolean(JsonNode jsonObject, String key) {
Boolean bool = jsonObject.get(key).asBoolean();
return bool;
}
public static JsonNode getJSONObject(JsonNode jsonObject, String key) {
JsonNode json = jsonObject.get(key);
return json;
}
}
3. 測試
- 新建一個 User 類
package com.yuhuofei.entity;
import lombok.Data;
import java.io.Serializable;
/**
* @Description
* @ClassName User
* @Author yuhuofei
* @Date 2023/8/19 14:49
* @Version 1.0
*/
@Data
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String passWord;
}
- 新建一個測試類
import com.yuhuofei.entity.User;
import com.yuhuofei.utils.JsonUtil;
/**
* @Description
* @ClassName TestJsonUtil
* @Author yuhuofei
* @Date 2023/8/19 14:58
* @Version 1.0
*/
public class TestJsonUtil {
public static void main(String[] args) {
String jsonString = "{\"id\":11,\"name\":\"小明\",\"passWord\":\"123456\"}";
User user = JsonUtil.parseObject(jsonString, User.class);
System.out.println(user);
}
}
執(zhí)行 main 方法測試,可以看到在控制臺正確地輸出了結果。

總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
使用@Value為靜態(tài)變量導入并使用導入的靜態(tài)變量進行初始化方式
這篇文章主要介紹了使用@Value為靜態(tài)變量導入并使用導入的靜態(tài)變量進行初始化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
Mybatis查詢Sql結果未映射到對應得實體類上的問題解決
使用mybatis查詢表數據得時候,發(fā)現(xiàn)對應得實體類字段好多都是null,本文主要介紹了Mybatis查詢Sql結果未映射到對應得實體類上的問題解決,具有一定的參考價值,感興趣的可以了解一下2024-02-02
SpringCloud集成zookeeper實現(xiàn)服務注冊并訪問功能
zookeeper和eureka一樣,是用于充當服務注冊功能服務器的一個springcloud插件,這篇文章主要介紹了SpringCloud集成zookeeper實現(xiàn)服務注冊并訪問,需要的朋友可以參考下2022-06-06

