1. 概述
使用Java處理JSON數據可以很容易,但——就像Java中的任何事物一樣,我們有許多選項和庫可以選擇。
本指南應該使您做出選擇更容易,併為您提供對生態系統的堅實理解。我們將討論Java中最常見的JSON處理庫:
我們為每個庫採用簡單的結構——首先是一些有用的資源,以便您入門(既包括Baeldung上的資源,也包括外部資源)。然後我們將介紹一個基本代碼示例,以便您瞭解使用該庫時的實際情況。
2. 流行度及基本統計信息
首先,讓我們用統計數據作為每個庫流行度的代理:
2.1. Jackson
2.2. Gson
- Maven 使用量:Maven (1588
- Github Stars: 2079
- Github Forks: 471
2.3. json-io
- Maven 使用量:Maven (11
- Github Stars: 129
- Github Forks: 40
2.4. Genson
- Maven 使用量:Maven (8
- Github Stars: 67
- Github Forks: 15
2.5. JSON-P
- Github Stars: 119
- Github Forks: 54
3. Jackson
接下來,讓我們看看這些中最受歡迎的之一——Jackson。Jackson 是一個多用途的 Java 庫,用於處理 JSON 數據。
3.1. 有用資源
以下是庫的官方資源:
在 Baeldung 上:
- Jackson 教程
- Jackson Date
- Jackson JSON Views
- 關於 Jackson 註解的指南
- Jackson 異常 – 問題與解決方案
- Jackson – 序列化/反序列化哪些字段
- Jackson – 雙向關係
- Jackson – 自定義序列化器
- Jackson – 自定義反序列器
其他有趣的寫篇:
3.2. Maven 依賴
要使用該庫——這是要添加到你的 pom.xml 的 Maven 依賴:
<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 庫。
4.1. 有用資源
以下是庫的官方資源:
在 Baeldung 上:
- Gson 序列化菜譜
- Gson 反序列化菜譜
其他有趣的文檔:
4.2. Maven 依賴
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
注意,Gson 的最新版本可以在 這裏,現在是 2.8.8.
4.3. 簡單示例使用 Gson
這是一個簡單的示例,説明了如何使用 Gson 將對象序列化為 JSON 和反序列化為 Java 對象:
@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() 用於將對象序列化為 JSON
- Gson.fromJson() 用於將 JSON 反序列化為 Java 對象
5. Json-io
Json-io 是一個簡單的 Java 庫,用於序列化/反序列化 JSON。5.1. 有用資源
以下是庫的官方資源:- json-io 在 Google Codejson-io 在 Github5.2. 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 依賴
<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() 用於將 Object 序列化為 JSON
- Genson.desrialize() 用於將 JSON 序列化為 Java Object
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 依賴
<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 處理庫相比,屬於低級。
8. 結論
在本文快速概述中,我們學習了 Java 中最常用的 JSON 處理庫。