1. 簡介
在本教程中,我們將探討在利用 OkHttp 解碼 JSON 響應時,可以使用的多種技術。
2. OkHttp Response
OkHttp 是一個為 Java 和 Android 提供的 HTTP 客户端,具有 GZIP 處理、響應緩存和從網絡問題中恢復等功能。
儘管 OkHttp 擁有這些強大的功能,但它沒有內置的 JSON、XML 及其他內容類型的編碼器/解碼器。但是,我們可以藉助 XML/JSON 綁定庫來實現這些功能,或者使用諸如 Feign 或 Retrofit 等高級庫。
要實現我們的 JSON 解碼器,我們需要從服務調用的結果中提取 JSON 數據。為此,我們可以通過 Response 對象中的 body() 方法訪問 body。 ResponseBody 類提供了多種提取數據的選項:
- byteStream(): 將 body 的原始字節暴露為一個 InputStream; 我們可以用於所有格式,但通常用於二進制文件和文件
- charStream(): 當我們有文本響應時,charStream() 會將 InputStream 包裹在一個 Reader 中,並根據響應的內容類型或“UTF-8”進行編碼(如果響應頭中未設置字符集);但是,在使用 charStream() 時,我們無法更改 Reader 的編碼
- string(): 將整個響應 body 作為 String 返回;它管理編碼方式與 charStream() 相同,但如果需要不同的編碼,可以使用 source().readString(charset) 代替
在本文中,由於我們的響應較小,我們沒有內存或性能方面的顧慮,因此我們將使用 string()。在生產系統中,byteStream() 和 charStream() 方法是更好的選擇,因為它們在性能和內存方面更重要。
為了開始,讓我們將 okhttp 添加到我們的 pom.xml 文件中:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>5.0.0-alpha.12</version>
</dependency>然後,我們對 SimpleEntity 進行建模以測試我們的解碼器:
public class SimpleEntity {
protected String name;
public SimpleEntity(String name) {
this.name = name;
}
// no-arg constructor, getters, and setters
}
現在,我們將啓動我們的測試:
SimpleEntity sampleResponse = new SimpleEntity("Baeldung");
OkHttpClient client = // build an instance;
MockWebServer server = // build an instance;
Request request = new Request.Builder().url(server.url("...")).build();3. 使用 Jackson 解碼 ResponseBody
Jackson 是 JSON 對象綁定最流行的庫之一。
請在 pom.xml 中添加 jackson-databind:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.2</version>
</dependency>Jackson 的 ObjectMapper 允許我們把 JSON 轉換為對象。因此,我們可以使用 ObjectMapper.readValue() 來解碼響應:
ObjectMapper objectMapper = new ObjectMapper();
ResponseBody responseBody = client.newCall(request).execute().body();
SimpleEntity entity = objectMapper.readValue(responseBody.string(), SimpleEntity.class);
Assert.assertNotNull(entity);
Assert.assertEquals(sampleResponse.getName(), entity.getName());4. 使用 Gson 解碼 ResponseBody
Gson 是一個有用的庫,用於將 JSON 映射到對象,反之亦然。
讓我們將 gson 添加到我們的 pom.xml 文件中:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>讓我們看看如何使用 Gson.fromJson() 來解碼響應體:
Gson gson = new Gson();
ResponseBody responseBody = client.newCall(request).execute().body();
SimpleEntity entity = gson.fromJson(responseBody.string(), SimpleEntity.class);
Assert.assertNotNull(entity);
Assert.assertEquals(sampleResponse.getName(), entity.getName());
5. 結論
在本文中,我們探討了使用 Jackson 和 Gson 解碼 OkHttp JSON 響應的幾種方法。