Java中JSON數(shù)據(jù)操作與處理全面指南
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式,廣泛應(yīng)用于前后端的數(shù)據(jù)傳遞和API通信中。它基于鍵值對的方式組織數(shù)據(jù),便于人類閱讀和機(jī)器解析。在Java開發(fā)中,處理JSON數(shù)據(jù)通常需要使用一些常見的庫,如Jackson、Gson、Fastjson等。本篇將介紹JSON的基本概念、常用操作及在Java中的具體應(yīng)用。
一、JSON的基本概念
JSON的數(shù)據(jù)結(jié)構(gòu)包括兩種:對象和數(shù)組。
對象:使用 {}
括起來,內(nèi)部是鍵值對的集合,每個鍵和值之間用冒號 :
分隔,多個鍵值對之間用逗號 ,
分隔。例如:
{ "name": "Alice", "age": 25, "address": { "city": "New York", "zip": "10001" } }
數(shù)組:使用 []
括起來,內(nèi)部是多個值,每個值之間用逗號分隔。例如:
[ "apple", "banana", "cherry" ]
二、JSON處理常見庫
1. Jackson
Jackson 是Java中處理JSON最常用的庫之一,它能夠輕松地將Java對象與JSON字符串互相轉(zhuǎn)換,具備高效、靈活、功能強(qiáng)大的特點(diǎn)。
對象轉(zhuǎn)JSON:
ObjectMapper objectMapper = new ObjectMapper(); User user = new User("Alice", 25); String jsonString = objectMapper.writeValueAsString(user);
JSON轉(zhuǎn)對象:
String jsonString = "{\"name\":\"Alice\", \"age\":25}"; User user = objectMapper.readValue(jsonString, User.class);
Jackson還支持復(fù)雜類型的解析、忽略字段、日期格式化等高級功能。
2. Gson
Gson 是由Google提供的另一款流行的JSON處理庫。它以輕量、易用著稱,適合處理簡單的JSON數(shù)據(jù)結(jié)構(gòu)。
對象轉(zhuǎn)JSON:
Gson gson = new Gson(); User user = new User("Bob", 30); String jsonString = gson.toJson(user);
JSON轉(zhuǎn)對象:
String jsonString = "{\"name\":\"Bob\", \"age\":30}"; User user = gson.fromJson(jsonString, User.class);
Gson的API風(fēng)格簡單明了,但在性能上可能略遜于Jackson。
3. Fastjson
Fastjson 是阿里巴巴開源的高性能JSON庫,特別在解析大量JSON數(shù)據(jù)時表現(xiàn)出色。
對象轉(zhuǎn)JSON:
User user = new User("Charlie", 28); String jsonString = JSON.toJSONString(user);
JSON轉(zhuǎn)對象:
String jsonString = "{\"name\":\"Charlie\", \"age\":28}"; User user = JSON.parseObject(jsonString, User.class);
Fastjson支持豐富的序列化/反序列化選項(xiàng),還能夠處理JSONPath等高級功能。
三、JSON的常見操作
1. 解析復(fù)雜的JSON結(jié)構(gòu)
通常我們處理的JSON不僅僅是簡單的對象,還可能是嵌套的對象或數(shù)組。以Jackson為例,我們可以使用 TypeReference
來處理復(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ā)中,有時我們希望將JSON數(shù)據(jù)轉(zhuǎn)為 Map<String, Object>
,以便于動態(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. 處理日期和時間格式
JSON默認(rèn)不支持日期格式,因此在處理日期類型的字段時需要特別處理。以Jackson為例,可以通過 @JsonFormat
注解指定日期格式。
public class Event { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") private Date eventDate; // getters and setters }
反序列化時,也可以全局配置 ObjectMapper
以處理日期格式:
ObjectMapper mapper = new ObjectMapper(); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
4. 忽略字段
在序列化/反序列化時,我們可能需要忽略某些不必要的字段。以Jackson為例,可以通過 @JsonIgnore
注解來忽略字段。
public class User { private String name; @JsonIgnore private String password; // getters and setters }
這將確保 password
字段不會出現(xiàn)在生成的JSON中。
5. 獲取Json數(shù)據(jù)中某個字段
// 獲取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); } }
性能對比
在選擇JSON庫時,性能是一個重要的考慮因素。下表簡要對比了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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot登錄驗(yàn)證的統(tǒng)一攔截處理的實(shí)現(xiàn)
如果不進(jìn)行統(tǒng)一的攔截處理,每次用戶請求你都要去進(jìn)行用戶的信息驗(yàn)證,所以本文主要介紹了Springboot登錄驗(yàn)證的統(tǒng)一攔截處理的實(shí)現(xiàn),感興趣的可以了解一下,感興趣的可以了解一下2023-09-09java基于poi導(dǎo)出excel透視表代碼實(shí)例
這篇文章主要介紹了java基于poi導(dǎo)出excel透視表代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConver
這篇文章主要介紹了springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConversions問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08Spring Boot 2.5.0 重新設(shè)計(jì)的spring.sql.init 配置有啥用
前幾天Spring Boot 2.5.0發(fā)布了,其中提到了關(guān)于Datasource初始化機(jī)制的調(diào)整,有讀者私信想了解這方面做了什么調(diào)整。那么今天就要詳細(xì)說說這個重新設(shè)計(jì)的配置內(nèi)容,并結(jié)合實(shí)際情況說說我的理解和實(shí)踐建議2021-05-05SpringBoot解決406錯誤之返回對象缺少Getter/Setter方法引發(fā)的問題
在Spring Boot開發(fā)中,接口請求返回?cái)?shù)據(jù)是系統(tǒng)交互的重要環(huán)節(jié),然而,開發(fā)過程中常常會遇到由于數(shù)據(jù)類型或返回格式問題導(dǎo)致的錯誤,其中最常見的就是406 Not Acceptable異常,本篇文章以實(shí)際的案例出發(fā),詳細(xì)分析在POST請求中產(chǎn)生406錯誤的原因2024-11-11SpringMVC中RequestMapping注解(作用、出現(xiàn)的位置、屬性)
這篇文章主要介紹了SpringMVC中RequestMapping注解(作用、出現(xiàn)的位置、屬性),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01