Java中JSON數(shù)據(jù)操作與處理全面指南
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,廣泛應(yīng)用于前后端的數(shù)據(jù)傳遞和API通信中。它基于鍵值對(duì)的方式組織數(shù)據(jù),便于人類閱讀和機(jī)器解析。在Java開發(fā)中,處理JSON數(shù)據(jù)通常需要使用一些常見的庫(kù),如Jackson、Gson、Fastjson等。本篇將介紹JSON的基本概念、常用操作及在Java中的具體應(yīng)用。
一、JSON的基本概念
JSON的數(shù)據(jù)結(jié)構(gòu)包括兩種:對(duì)象和數(shù)組。
對(duì)象:使用 {} 括起來(lái),內(nèi)部是鍵值對(duì)的集合,每個(gè)鍵和值之間用冒號(hào) : 分隔,多個(gè)鍵值對(duì)之間用逗號(hào) , 分隔。例如:
{
"name": "Alice",
"age": 25,
"address": {
"city": "New York",
"zip": "10001"
}
}數(shù)組:使用 [] 括起來(lái),內(nèi)部是多個(gè)值,每個(gè)值之間用逗號(hào)分隔。例如:
[ "apple", "banana", "cherry" ]
二、JSON處理常見庫(kù)
1. Jackson
Jackson 是Java中處理JSON最常用的庫(kù)之一,它能夠輕松地將Java對(duì)象與JSON字符串互相轉(zhuǎn)換,具備高效、靈活、功能強(qiáng)大的特點(diǎn)。
對(duì)象轉(zhuǎn)JSON:
ObjectMapper objectMapper = new ObjectMapper();
User user = new User("Alice", 25);
String jsonString = objectMapper.writeValueAsString(user);JSON轉(zhuǎn)對(duì)象:
String jsonString = "{\"name\":\"Alice\", \"age\":25}";
User user = objectMapper.readValue(jsonString, User.class);Jackson還支持復(fù)雜類型的解析、忽略字段、日期格式化等高級(jí)功能。
2. Gson
Gson 是由Google提供的另一款流行的JSON處理庫(kù)。它以輕量、易用著稱,適合處理簡(jiǎn)單的JSON數(shù)據(jù)結(jié)構(gòu)。
對(duì)象轉(zhuǎn)JSON:
Gson gson = new Gson();
User user = new User("Bob", 30);
String jsonString = gson.toJson(user);JSON轉(zhuǎn)對(duì)象:
String jsonString = "{\"name\":\"Bob\", \"age\":30}";
User user = gson.fromJson(jsonString, User.class);Gson的API風(fēng)格簡(jiǎn)單明了,但在性能上可能略遜于Jackson。
3. Fastjson
Fastjson 是阿里巴巴開源的高性能JSON庫(kù),特別在解析大量JSON數(shù)據(jù)時(shí)表現(xiàn)出色。
對(duì)象轉(zhuǎn)JSON:
User user = new User("Charlie", 28);
String jsonString = JSON.toJSONString(user);JSON轉(zhuǎn)對(duì)象:
String jsonString = "{\"name\":\"Charlie\", \"age\":28}";
User user = JSON.parseObject(jsonString, User.class);Fastjson支持豐富的序列化/反序列化選項(xiàng),還能夠處理JSONPath等高級(jí)功能。
三、JSON的常見操作
1. 解析復(fù)雜的JSON結(jié)構(gòu)
通常我們處理的JSON不僅僅是簡(jiǎn)單的對(duì)象,還可能是嵌套的對(duì)象或數(shù)組。以Jackson為例,我們可以使用 TypeReference 來(lái)處理復(fù)雜的嵌套類型。
String jsonString = "[{\"name\":\"Alice\",\"age\":25},{\"name\":\"Bob\",\"age\":30}]";
ObjectMapper mapper = new ObjectMapper();
List<User> users = mapper.readValue(jsonString, new TypeReference<List<User>>(){});2. JSON與Map互轉(zhuǎn)
在實(shí)際開發(fā)中,有時(shí)我們希望將JSON數(shù)據(jù)轉(zhuǎn)為 Map<String, Object>,以便于動(dòng)態(tài)操作數(shù)據(jù)。
JSON轉(zhuǎn)Map:
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = "{\"name\":\"Alice\", \"age\":25}";
Map<String, Object> map = objectMapper.readValue(jsonString, new TypeReference<Map<String,Object>>(){});Map轉(zhuǎn)JSON:
Map<String, Object> map = new HashMap<>();
map.put("name", "Alice");
map.put("age", 25);
String jsonString = objectMapper.writeValueAsString(map);3. 處理日期和時(shí)間格式
JSON默認(rèn)不支持日期格式,因此在處理日期類型的字段時(shí)需要特別處理。以Jackson為例,可以通過 @JsonFormat 注解指定日期格式。
public class Event {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date eventDate;
// getters and setters
}反序列化時(shí),也可以全局配置 ObjectMapper 以處理日期格式:
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));4. 忽略字段
在序列化/反序列化時(shí),我們可能需要忽略某些不必要的字段。以Jackson為例,可以通過 @JsonIgnore 注解來(lái)忽略字段。
public class User {
private String name;
@JsonIgnore
private String password;
// getters and setters
}這將確保 password 字段不會(huì)出現(xiàn)在生成的JSON中。
5. 獲取Json數(shù)據(jù)中某個(gè)字段
// 獲取params里面的documentId
JsonNode jsonNode = new ObjectMapper().readTree(record.getParams());
if (jsonNode.has("documentId")) {
Integer documentId = jsonNode.get("documentId").asInt();
record.setDocTypeId(documentId);
if (clearLogDto.getDocTypeId() != null && !documentId.equals(clearLogDto.getDocTypeId())) {
delete.add(record);
}
}性能對(duì)比
在選擇JSON庫(kù)時(shí),性能是一個(gè)重要的考慮因素。下表簡(jiǎn)要對(duì)比了Jackson、Gson、Fastjson三者的性能表現(xiàn):
| 特性 | Jackson | Gson | Fastjson |
|---|---|---|---|
| 性能 | 高 | 中 | 高 |
| 易用性 | 中 | 高 | 中 |
| 功能豐富性 | 高 | 中 | 高 |
| 社區(qū)支持 | 強(qiáng) | 強(qiáng) | 強(qiáng) |
參考:
JSON處理——FastJson、Jackson、Gson詳細(xì)使用_gson fastjson-CSDN博客
到此這篇關(guān)于JSON數(shù)據(jù)操作與處理全面指南的文章就介紹到這了,更多相關(guān)JSON數(shù)據(jù)操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用mvn?deploy命令上傳jar包的實(shí)現(xiàn)
本文介紹了使用mvndeploy:deploy-file命令將本地倉(cāng)庫(kù)中的JAR包重新發(fā)布到Maven私服,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
淺談關(guān)于Java中TimeZone鎖競(jìng)爭(zhēng)引發(fā)的問題解決
本文主要介紹了淺談關(guān)于Java中TimeZone鎖競(jìng)爭(zhēng)引發(fā)的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-02-02
RabbitMQ在微服務(wù)架構(gòu)中的落地:消息推送?/?解耦?/?削峰填谷
本文介紹了RabbitMQ在微服務(wù)架構(gòu)中的三大應(yīng)用場(chǎng)景:消息推送、服務(wù)解耦和削峰填谷,通過實(shí)際代碼示例展示了如何在實(shí)際項(xiàng)目中應(yīng)用RabbitMQ實(shí)現(xiàn)這些模式,感興趣的朋友一起看看吧2026-05-05
Java必備知識(shí)之位運(yùn)算及常見進(jìn)制解讀
從現(xiàn)代計(jì)算機(jī)中所有的數(shù)據(jù)二進(jìn)制的形式存儲(chǔ)在設(shè)備中。即 0、1 兩種狀態(tài),計(jì)算機(jī)對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行的運(yùn)算(+、-、*、/)都是叫位運(yùn)算,即將符號(hào)位共同參與運(yùn)算的運(yùn)算2021-10-10

