知識庫 / HTTP Client-Side RSS 訂閱

解析 OkHttp JSON 響應

HTTP Client-Side,JSON
HongKong
6
09:53 PM · Dec 05 ,2025

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 響應的幾種方法。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.