1. 概述
使用 Java 處理 JSON 數據可以很簡單,但 – 就像 Java 中大多數事物一樣 – 我們有許多選項和庫可以選擇。
本指南旨在使您做出選擇時更加容易,併為您提供對該生態系統的堅實理解。我們將討論 Java 中最常用的 JSON 處理庫:
我們為每個庫採用了一種簡單的結構 – 首先是一些有用的資源,以便您入門(包括在此處的 Baeldung 以及外部資源)。然後,我們將介紹 一個基本的代碼示例,以瞭解使用該庫時的實際情況。
2. 流行度及基本統計數據
首先,讓我們通過一些統計數據作為衡量每個庫流行度的指標:
2.1. Jackson
2.2. Gson
2.3. json-io
2.4. Genson
2.5. JSON-P
- Github 星標: 119
- Github 分支: 54
3. Jackson
接下來,我們來了解一下這些中最受歡迎的——Jackson。Jackson 是一個多用途的 Java 庫,用於處理 JSON 數據。
3.1. 有用資源
以下是庫的官方資源:
在 Baeldung 上:
- Jackson 教程
- Jackson 和日期
- Jackson JSON Views
- Jackson 註解指南
- Jackson 異常 – 問題與解決方案
- Jackson – 決定哪些字段進行序列化/反序列化
- Jackson – 雙向關係
- Jackson – 自定義序列化器
- Jackson – 自定義反序列器
其他有趣的文檔:
3.2. Maven 依賴
要使用該庫,請將以下 Maven 依賴添加到您的 <em pom.xml</em> 文件中:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.2</version>
</dependency>請確保獲取 Jackson 的最新版本。
3.3. 簡單示例:使用 Jackson
現在,讓我們通過一個簡單的示例來了解如何使用 Jackson:
@Test
public void whenSerializeAndDeserializeUsingJackson_thenCorrect()
throws IOException{
Foo foo = new Foo(1,"first");
ObjectMapper mapper = new ObjectMapper();
String jsonStr = mapper.writeValueAsString(foo);
Foo result = mapper.readValue(jsonStr, Foo.class);
assertEquals(foo.getId(),result.getId());
}請注意:
- ObjectMapper.writeValueAsString() 用於將對象序列化為 JSON 字符串。
- ObjectMapper.readValue() 用於將 JSON 字符串反序列化為 Java 對象。
- 示例 JSON 輸出:
{
"id":1,
"name":"first"
}4. Gson
Gson 是我們將要深入研究的下一款 Java JSON 庫。
<h3><strong>4.1. 有用資源</strong></h3
<p>以下是庫的官方資源:</p>
<ul
>
<li
><a
href="https://github.com/google/gson"
target="_blank"
rel="noopener noreferrer"
>Gson on Github</a
>
</li>
<li
><a
href="https://sites.google.com/site/gson/gson-user-guide"
target="_blank"
rel="noopener noreferrer"
>Gson User Guide</a
>
</li>
</ul
>
<p><strong>在 Baeldung 上:</strong></p>
<ul
>
<li
>Gson 序列化食譜
</li>
<li
>Gson 反序列化食譜
</li>
</ul
>
<p><strong>其他有趣的文檔:</strong></p>
<ul
>
<li
><a
href="https://www.studytrails.com/2016/09/12/java-google-json-exclusion-strategy/"
target="_blank"
rel="noopener"
>Gson 排除策略</a
>
</li>
<li
><a
href="https://www.studytrails.com/2016/09/12/java-google-json-custom-serializer-deserializer/"
target="_blank"
rel="noopener"
>Gson 自定義序列化/反序列化器</a
>
</li>
<li
><a
href="http://www.concretepage.com/google-api/java-gson-json-tutorial-examples"
target="_blank"
rel="noopener noreferrer"
>Java Gson + JSON 教程及示例</a
>
</li>
</ul
>
4.2. Maven 依賴
Maven 是一種流行的構建工具,用於管理項目依賴關係。它使用倉庫來存儲和管理項目所需的各種組件,例如 JAR 文件、WAR 文件等。
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
4.3. 使用 Gson 的簡單示例
以下是一個簡單的示例,説明了如何使用 Gson 進行 JSON 的序列化/反序列化:
@Test
public void whenSerializeAndDeserializeUsingGson_thenCorrect(){
Gson gson = new Gson();
Foo foo = new Foo(1,"first");
String jsonStr = gson.toJson(foo);
Foo result = gson.fromJson(jsonStr, Foo.class);
assertEquals(foo.getId(),result.getId());
}請注意:
- Gson.toJson() 用於將 Object 序列化為 JSON
- Gson.fromJson() 用於將 JSON 序列化為 Java Object
5. Json-io
Json-io 是一個簡單的 Java 庫,用於序列化/反序列化 JSON。
5.1. 有用資源
以下是庫的官方資源:
5.2. Maven 依賴
Maven 依賴是構建項目時,項目之間相互依賴的組件。Maven 通過倉庫管理中心(Repository Manager)來管理這些依賴,確保項目能夠順利構建和運行。 開發者可以使用 Maven 的依賴管理功能,輕鬆地添加、更新和刪除項目所需的各種依賴項。
<dependency>
<groupId>com.cedarsoftware</groupId>
<artifactId>json-io</artifactId>
<version>${json-io.version}</version>
</dependency>請注意,當前 json-io 的最新版本是 4.13.0。
5.3. 使用 json-io 的簡單示例
現在,讓我們來看一個使用 json-io 的簡單示例:
@Test
public void whenSerializeAndDeserializeUsingJsonio_thenCorrect(){
Foo foo = new Foo(1,"first");
String jsonStr = JsonWriter.objectToJson(foo);
Foo result = (Foo) JsonReader.jsonToJava(jsonStr);
assertEquals(foo.getId(),result.getId());
}請注意:
- JsonWriter.objectToJson() 用於將對象序列化為 JSON。
- JsonReader.jsonToJava() 用於將 JSON 反序列化為 Java 對象。
- 示例 JSON 輸出:
{
"@type":"org.baeldung.Foo",
"id":1,
"name":"first"
}6. Genson
Genson 是一個 Java 和 Scala 到 JSON 轉換庫,提供完整的綁定和流式功能。
6.1. 有用資源
以下是庫的官方資源:
6.2. Maven 依賴
Maven 依賴是構建項目時,項目之間相互依賴關係的一種管理方式。Maven 通過倉庫(Repository)來管理這些依賴,方便開發者快速獲取和使用所需的第三方庫和組件。 開發者可以使用 Maven 的依賴管理功能,聲明項目所依賴的外部庫,Maven 會自動下載並管理這些依賴,確保項目構建的完整性和可重複性。 常見的 Maven 倉庫類型包括本地倉庫、中央倉庫和遠程倉庫。
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>${genson.version}</version>
</dependency>請注意,目前 Genson 的最新版本為 1.6。
6.3. 簡單示例:使用 Genson
以下是一個使用該庫的簡單示例:
@Test
public void whenSerializeAndDeserializeUsingGenson_thenCorrect(){
Genson genson = new Genson();
Foo foo = new Foo(1,"first");
String jsonStr = genson.serialize(foo);
Foo result = genson.deserialize(jsonStr, Foo.class);
assertEquals(foo.getId(),result.getId());
}請注意:
- Genson.serialize() 用於將對象序列化為 JSON
- Genson.desrialize() 用於將 JSON 反序列化為 Java 對象
7. JSON-P
JSON-P 是一個 Java API,用於解析、構建、轉換和查詢 JSON 消息。 Java Specification Request (JSR) 353 提出了該 API。 JSR 353 的目標是開發一個 Java API 來處理 JSON。 像 Jackson、Gson 等流行的庫,通常不會直接實現該規範。
7.1. 有用資源
以下是庫的官方資源:
7.2. Maven 依賴
Maven 依賴是構建項目時,項目之間相互依賴的組件。 它們定義了項目需要哪些外部庫或模塊,以及如何下載和管理這些依賴。 依賴關係可以幫助開發者避免重複工作,並確保項目使用最新和最穩定的版本。
以下是一些關於 Maven 依賴的重要概念:
- 依賴聲明 (Dependency Declaration): 在項目的
pom.xml文件中,使用<dependency>標籤來聲明項目所需的依賴。 - 依賴管理 (Dependency Management): Maven 負責下載、管理和更新依賴,確保項目依賴的版本一致性。
- 依賴衝突 (Dependency Conflicts): 當多個依賴聲明相同的依賴版本時,可能會發生衝突。 Maven 提供瞭解決依賴衝突的機制。
// 示例:聲明對 JUnit 的依賴
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency> <groupId>jakarta.json</groupId> <artifactId>jakarta.json-api</artifactId> <version>${jsonp.version}</version> </dependency><dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.json</artifactId> <version>${provider.version}</version> <classifier>module<classifier> </dependency>
請注意,我們需要 API模塊和 默認提供者依賴項。最新版本分別為 2.1.1 和 2.0.1。
7.3. 簡單示例:使用 JSON-P
讓我們來看一個簡單的 JSON-P 用例:
@Test
public void whenTransformingAndParsingUsingJsonp_thenCorrect() {
Foo foo = new Foo(1, "First");
JsonObject json = Json.createObjectBuilder()
.add("id", foo.getId())
.add("name", foo.getName())
.build();
String result = json.toString();
JsonParser parser = Json.createParser(new StringReader(result));
while (parser.hasNext()) {
Event event = parser.next();
switch (event) {
case VALUE_STRING:
String value = parser.getString();
assertEquals(foo.getName(), value);
break;
}
}
parser.close();
}請注意:
- Json.createObjectBuilder() 用於將對象轉換為 JSON。
- Json.createParser() 用於解析 JSON 消息。
- JSON-P API 與 Java 中其他 JSON 處理庫相比,屬於低級 API。
8. 結論
在本文快速概述中,我們學習了 Java 中最常用的 JSON 處理庫。