如何在Java中使用org.json和JSON-B解析與編寫JSON
前言
JSON(JavaScript Object Notation)因其輕量、語言無關(guān)且易于讀寫的特性,已成為現(xiàn)代 Web 應(yīng)用中數(shù)據(jù)交換的標準格式。在 Java 中,處理 JSON 的庫眾多,其中 org.json
和 JSON-B 是兩種流行的選擇。本文將深入探討這兩種庫的特點、使用示例、優(yōu)缺點以及適用場景,幫助開發(fā)者根據(jù)項目需求選擇合適的工具。
1. JSON 在 Java 中的重要性
JSON 是一種基于文本的數(shù)據(jù)格式,源自 JavaScript 編程語言(ECMA-262 第 3 版)。它支持兩種主要結(jié)構(gòu):
- 對象:鍵值對集合,通常用大括號
{}
表示。 - 數(shù)組:有序值列表,用方括號
[]
表示。
JSON 的簡單性和跨語言兼容性使其成為 API 數(shù)據(jù)傳輸和配置文件存儲的理想選擇。在 Java 中,處理 JSON 需要專門的庫來解析 JSON 字符串并將其轉(zhuǎn)換為 Java 對象,或?qū)?Java 對象序列化為 JSON 字符串。本文將重點介紹 org.json
和 JSON-B 兩種庫。
2. org.json 概述
org.json
(也稱為 JSON-Java)是一個輕量級的 Java 庫,廣泛用于 JSON 數(shù)據(jù)的解析和生成。它在 Android 開發(fā)中尤為流行,因為它是 Android 平臺的默認 JSON 庫。該庫提供核心類如 JSONObject
和 JSONArray
,用于處理 JSON 對象和數(shù)組。
2.1 org.json 的特點
- 簡單 API:易于上手,適合基本的 JSON 操作。
- 解析功能:支持從字符串、輸入流或讀取器解析 JSON。
- 序列化:允許從 Java 數(shù)據(jù)創(chuàng)建 JSON 對象和數(shù)組。
- 格式轉(zhuǎn)換:支持 JSON 與 XML、HTTP 頭、Cookie 等格式的轉(zhuǎn)換。
- 無依賴:無需外部庫,適合輕量級項目。
2.2 使用示例
以下是使用 org.json
解析和編寫 JSON 的示例代碼。
解析 JSON
以下代碼展示如何從 JSON 文件中讀取數(shù)據(jù)并提取特定字段:
public class SoftwareParseOrgJson { final static String FILE_NAME = "/json/softwareinfo.json"; public static void main(String[] args) throws Exception { InputStream jsonInput = SoftwareParseOrgJson.class.getResourceAsStream(FILE_NAME); if (jsonInput == null) { throw new NullPointerException("can't find" + FILE_NAME); } JSONObject obj = new JSONObject(new JSONTokener(jsonInput)); System.out.println("Software Name: " + obj.getString("name")); System.out.println("Version: " + obj.getString("version")); System.out.println("Description: " + obj.getString("description")); System.out.println("Class: " + obj.getString("className")); JSONArray contribs = obj.getJSONArray("contributors"); for (int i = 0; i < contribs.length(); i++) { System.out.println("Contributor Name: " + contribs.get(i)); } } }
輸出:
Software Name: robinparse Version: 1.2.3 Description: Another Parser for JSON Class: RobinParse Contributor Name: Robin Smythe Contributor Name: Jon Jenz Contributor Name: Jan Ardann
此代碼通過 JSONTokener
從輸入流創(chuàng)建 JSONObject
,然后使用 getString
和 getJSONArray
方法提取字段。注意,JSONArray
不支持 Iterable
,因此需要使用傳統(tǒng) for 循環(huán)遍歷。
編寫 JSON
以下代碼展示如何創(chuàng)建 JSON 對象并將其轉(zhuǎn)換為字符串:
.ConcurrentHashMap
public class WriteOrgJson { public static void main(String[] args) { JSONObject jsonObject = new JSONObject(); jsonObject.put("Name", "robinParse") .put("Version", "1.2.3") .put("Class", "RobinParse"); String printable = jsonObject.toString(); System.out.println(printable); } }
輸出:
{"Name":"robinParse","Class":"RobinParse","Version":"1.2.3"}
此代碼利用 JSONObject
的流式 API(支持方法鏈式調(diào)用)添加鍵值對,并通過 toString
方法生成格式化的 JSON 字符串。
2.3 org.json 的優(yōu)缺點
優(yōu)點 | 缺點 |
---|---|
API 簡單,易于快速上手 | 功能較少,缺乏高級映射支持 |
無外部依賴,輕量級 | 不如 Jackson 等庫強大 |
廣泛用于 Android 開發(fā) | 定制化能力有限 |
3. JSON-B 概述
JSON-B(JSON Binding)是 Java API for JSON Binding(JSR-367),是 Jakarta EE 平臺的一部分。它旨在通過自動映射簡化 Java 對象與 JSON 數(shù)據(jù)之間的轉(zhuǎn)換。JSON-B 的參考實現(xiàn)是 Yasson,它還被納入 Eclipse MicroProfile 項目。
3.1 JSON-B 的特點
- 標準 API:確??鐚崿F(xiàn)的可移植性。
- 自動映射:無需手動解析,支持 Java 對象與 JSON 的雙向轉(zhuǎn)換。
- 定制化:通過注解支持靈活的映射配置。
- 企業(yè)級支持:集成于 Jakarta EE,適合復(fù)雜應(yīng)用。
- 易用性:方法命名直觀,減少開發(fā)工作量。
3.2 使用示例
以下是使用 JSON-B 讀取和編寫 JSON 的示例代碼。
讀取和編寫 JSON
以下代碼展示如何將 JSON 字符串轉(zhuǎn)換為 Java 對象并反向序列化:
public class ReadWriteJsonB { public static void main(String[] args) throws IOException { Jsonb jsonb = JsonbBuilder.create(); // 讀取 String jsonInput = "{\"id\":0,\"firstName\":\"Robin\",\"lastName\":\"Williams\"}"; Person rw = jsonb.fromJson(jsonInput, Person.class); System.out.println(rw); // 編寫 String result = jsonb.toJson(rw); System.out.println(result); } }
輸出(假設(shè) Person
類有適當?shù)?nbsp;toString
方法):
Person{id=0, firstName=Robin, lastName=Williams}
{"firstName":"Robin","id":0,"lastName":"Williams"}
此代碼通過 JsonbBuilder
創(chuàng)建 Jsonb
實例,使用 fromJson
將 JSON 字符串轉(zhuǎn)換為 Person
對象,再通過 toJson
將對象轉(zhuǎn)換回 JSON 字符串。默認情況下,Person
類無需注解即可工作。
定制化示例
JSON-B 支持通過注解定制映射。例如,排除冗余字段:
public class Person { private int id; private String firstName; private String lastName; @JsonbTransient public String getFullName() { return firstName + " " + lastName; } // getter 和 setter... }
運行上述代碼后,輸出將不包含 fullName
字段:
{"firstName":"Robin","id":0,"lastName":"Williams"}
通過 @JsonbTransient
注解,getFullName
方法的返回值被排除在 JSON 輸出之外,從而減少數(shù)據(jù)冗余。
3.3 JSON-B 的優(yōu)缺點
優(yōu)點 | 缺點 |
---|---|
標準 API,跨平臺一致性 | 需要 Jakarta EE 環(huán)境 |
自動映射,開發(fā)效率高 | 對于簡單任務(wù)可能過于復(fù)雜 |
支持高級定制化 | 依賴外部庫 |
4. org.json 與 JSON-B 的比較
以下是對 org.json
和 JSON-B 的詳細比較:
特性 | org.json | JSON-B |
---|---|---|
標準化 | 非標準,但廣泛使用 | 標準 API(JSR-367) |
易用性 | 適合簡單操作 | 自動映射,開發(fā)更高效 |
定制化 | 有限 | 通過注解支持廣泛定制 |
性能 | 適合中小型數(shù)據(jù) | 優(yōu)化用于大型數(shù)據(jù)集 |
依賴 | 無需外部依賴 | 需要 Jakarta EE 或類似環(huán)境 |
適用場景 | 通用 JSON 解析/編寫 | Java 對象與 JSON 綁定 |
5. 適用場景
使用 org.json 的場景:
- 需要輕量級、無依賴的 JSON 處理庫。
- 在 Android 項目中進行簡單 JSON 操作。
- 項目對高級功能需求較低。
使用 JSON-B 的場景:
- 在 Jakarta EE 或 MicroProfile 環(huán)境中開發(fā)企業(yè)級應(yīng)用。
- 需要標準化的 JSON 綁定 API。
- 項目要求復(fù)雜的對象映射和定制化。
6. 結(jié)論
org.json
和 JSON-B 都是 Java 中處理 JSON 的強大工具,各自適用于不同場景。org.json
因其簡單性和無依賴特性,適合輕量級項目和 Android 開發(fā);而 JSON-B 作為標準 API,提供自動映射和高級定制功能,適合企業(yè)級應(yīng)用。開發(fā)者應(yīng)根據(jù)項目需求(如環(huán)境、復(fù)雜性和標準化要求)選擇合適的庫。
通過理解這兩種庫的優(yōu)缺點,您可以為您的 Java 項目選擇最佳的 JSON 處理方案。
關(guān)鍵引用
到此這篇關(guān)于如何在Java中使用org.json和JSON-B解析與編寫JSON的文章就介紹到這了,更多相關(guān)org.json和JSON-B解析JSON內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot Redis實現(xiàn)接口冪等性校驗方法詳細講解
這篇文章主要介紹了SpringBoot Redis實現(xiàn)接口冪等性校驗方法,近期一個老項目出現(xiàn)了接口冪等性校驗問題,前端加了按鈕置灰,依然被人拉著接口參數(shù)一頓輸出,還是重復(fù)調(diào)用了接口,通過復(fù)制粘貼,完成了后端接口冪等性調(diào)用校驗2022-11-11SpringBoot程序打包失敗(.jar中沒有主清單屬性)
在學(xué)習SpringBoot,打包SpringBoot程序后,在cmd運行出現(xiàn)了 某某某.jar中沒有注清單屬性,本文就來介紹一下原因以及解決方法,感興趣的可以了解一下2023-06-06面試題:Java 實現(xiàn)查找旋轉(zhuǎn)數(shù)組的最小數(shù)字
這篇文章主要介紹了Java 實現(xiàn)查找旋轉(zhuǎn)數(shù)組的最小數(shù)字,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07Java多線程之synchronized關(guān)鍵字的使用
這篇文章主要介紹了Java多線程之synchronized關(guān)鍵字的使用,文中有非常詳細的代碼示例,對正在學(xué)習java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04springboot validator枚舉值校驗功能實現(xiàn)
這篇文章主要介紹了springboot validator枚舉值校驗功能實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下2020-01-01