使用Jackson封裝常用的JsonUtil工具類方式
在實(shí)際開發(fā)中,我們對(duì)于 JSON 數(shù)據(jù)的處理,通常有這么幾個(gè)第三方工具包可以使用:
- gson:谷歌的
- fastjson:阿里巴巴的
- jackson:美國(guó)FasterXML公司的,Spring框架默認(rèn)用的
由于以前一直用習(xí)慣了阿里的 fastjson,最近突然改為 jackson ,不是太習(xí)慣,所以手寫一個(gè)工具類,應(yīng)付一下工作中常用的一些方法。
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 由于習(xí)慣了用fastjson處理JSON數(shù)據(jù),突然改成用jackson,有些不適應(yīng),所以打算用jackson封裝出類似fastjson里的方法進(jìn)行使用
* @ClassName JsonUtil
* @Author yuhuofei
* @Date 2023/8/19 14:36
* @Version 1.0
*/
@Slf4j
public class JsonUtil {
private static ObjectMapper objectMapper = new ObjectMapper();
// 時(shí)間日期格式
private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss";
//以靜態(tài)代碼塊初始化
static {
//對(duì)象的所有字段全部列入序列化
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
//取消默認(rèn)轉(zhuǎn)換timestamps形式
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//忽略空Bean轉(zhuǎn)json的錯(cuò)誤
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
//所有的日期格式都統(tǒng)一為以下的格式,即yyyy-MM-dd HH:mm:ss
objectMapper.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT));
//忽略 在json字符串中存在,但在java對(duì)象中不存在對(duì)應(yīng)屬性的情況。防止錯(cuò)誤
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
/**===========================以下是從JSON中獲取對(duì)象====================================*/
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轉(zhuǎn)為自定義對(duì)象失?。簕}", 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字符串轉(zhuǎn)為自定義對(duì)象失?。簕}", e.getMessage());
}
return t;
}
//將json數(shù)組字符串轉(zhuǎn)為指定對(duì)象List列表或者M(jìn)ap集合
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轉(zhuǎn)為L(zhǎng)ist列表或者M(jìn)ap集合失?。簕}", e.getMessage());
}
return t;
}
/**=================================以下是將對(duì)象轉(zhuǎn)為JSON=====================================*/
public static String toJSONString(Object object) {
String jsonString = null;
try {
jsonString = objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
log.error("Object轉(zhuǎn)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轉(zhuǎn)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相關(guān)的=======================================*/
//JsonNode和JSONObject一樣,都是JSON樹形模型,只不過(guò)在jackson中,存在的是JsonNode
public static JsonNode parseJSONObject(String jsonString) {
JsonNode jsonNode = null;
try {
jsonNode = objectMapper.readTree(jsonString);
} catch (JsonProcessingException e) {
log.error("JSONString轉(zhuǎn)為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轉(zhuǎn)JSONString失?。簕}", e.getMessage());
}
return jsonString;
}
//JsonNode是一個(gè)抽象類,不能實(shí)例化,創(chuàng)建JSON樹形模型,得用JsonNode的子類ObjectNode,用法和JSONObject大同小異
public static ObjectNode newJSONObject() {
return objectMapper.createObjectNode();
}
//創(chuàng)建JSON數(shù)組對(duì)象,就像JSONArray一樣用
public static ArrayNode newJSONArray() {
return objectMapper.createArrayNode();
}
/**===========以下是從JsonNode對(duì)象中獲取key值的方法,個(gè)人覺(jué)得有點(diǎn)多余,直接用JsonNode自帶的取值方法會(huì)好點(diǎn),出于糾結(jié)癥,還是補(bǔ)充進(jìn)來(lái)了*/
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. 測(cè)試
- 新建一個(gè) 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;
}
- 新建一個(gè)測(cè)試類
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 方法測(cè)試,可以看到在控制臺(tái)正確地輸出了結(jié)果。

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用@Value為靜態(tài)變量導(dǎo)入并使用導(dǎo)入的靜態(tài)變量進(jìn)行初始化方式
這篇文章主要介紹了使用@Value為靜態(tài)變量導(dǎo)入并使用導(dǎo)入的靜態(tài)變量進(jìn)行初始化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
詳解Java子線程異常時(shí)主線程事務(wù)如何回滾
如果主線程向線程池提交了一個(gè)任務(wù),如果執(zhí)行這個(gè)任務(wù)過(guò)程中發(fā)生了異常,如何讓主線程捕獲到該異常并且進(jìn)行事務(wù)的回滾?本篇文章帶給你答案2022-03-03
Mybatis查詢Sql結(jié)果未映射到對(duì)應(yīng)得實(shí)體類上的問(wèn)題解決
使用mybatis查詢表數(shù)據(jù)得時(shí)候,發(fā)現(xiàn)對(duì)應(yīng)得實(shí)體類字段好多都是null,本文主要介紹了Mybatis查詢Sql結(jié)果未映射到對(duì)應(yīng)得實(shí)體類上的問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
淺談Hibernate對(duì)象狀態(tài)之間的神奇轉(zhuǎn)換
這篇文章主要介紹了淺談Hibernate對(duì)象狀態(tài)之間的神奇轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
IDEA配置MAVEN本地倉(cāng)庫(kù)的實(shí)現(xiàn)步驟
本文主要介紹了IDEA配置MAVEN本地倉(cāng)庫(kù)的實(shí)現(xiàn)步驟,將詳細(xì)介紹如何配置Maven環(huán)境變量,Maven配置文件,可以輕松地設(shè)置和配置MAVEN本地倉(cāng)庫(kù),以便在IDEA中享受更高效的開發(fā)體驗(yàn)2023-08-08
SpringCloud集成zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)并訪問(wèn)功能
zookeeper和eureka一樣,是用于充當(dāng)服務(wù)注冊(cè)功能服務(wù)器的一個(gè)springcloud插件,這篇文章主要介紹了SpringCloud集成zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)并訪問(wèn),需要的朋友可以參考下2022-06-06

