1. 简介

在本教程中,我们将探讨使用 OkHttp 时解析 JSON 响应的几种常用方式。

OkHttp 是一个功能强大的 HTTP 客户端,广泛用于 Java 和 Android 开发中。虽然它本身不提供 JSON 编解码功能,但我们可以借助 Jackson、Gson 等主流 JSON 框架轻松实现。

2. OkHttp 的 Response 对象

OkHttp 提供了多种方式访问 HTTP 响应体,其中 ResponseBody 类提供了几个常用方法来提取数据:

  • byteStream():以 InputStream 形式返回原始字节,适合处理文件或二进制数据
  • charStream():将响应体包装为 Reader,自动处理字符集编码(默认 UTF-8)
  • string():一次性将整个响应体读取为字符串,适用于小数据量,便于调试

⚠️ 注意:在生产环境中,建议优先使用 byteStream()charStream() 来避免内存问题。

首先,我们引入 OkHttp 的 Maven 依赖:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId> 
    <version>5.0.0-alpha.12</version> 
</dependency>

接着定义一个简单的 POJO 类用于测试:

public class SimpleEntity {
    protected String name;

    public SimpleEntity(String name) {
        this.name = name;
    }

    // 无参构造器、getter 和 setter 省略
}

然后初始化测试环境:

SimpleEntity sampleResponse = new SimpleEntity("Baeldung");

OkHttpClient client = new OkHttpClient(); 
MockWebServer server = new MockWebServer();
Request request = new Request.Builder().url(server.url("/test")).build();

3. 使用 Jackson 解析 ResponseBody

Jackson 是 Java 中最流行的 JSON 框架之一,支持高性能的 JSON 序列化与反序列化。

添加 Jackson 的依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.16.1</version>
</dependency>

使用 ObjectMapper 解析 JSON 响应:

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());

优点:Jackson 支持复杂类型、泛型、注解驱动等,适合大型项目。

4. 使用 Gson 解析 ResponseBody

Gson 是 Google 提供的轻量级 JSON 框架,简单易用,适合中小型项目。

添加 Gson 的依赖:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

使用 Gson.fromJson() 解析 JSON 响应:

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());

优点:Gson API 更加简洁,对 Kotlin 等现代语言支持良好。

5. 总结

本文介绍了两种常见方式解析 OkHttp 返回的 JSON 数据:使用 Jackson 和 Gson。

方式 适用场景 优点
Jackson 大型项目、复杂结构 性能高、功能丰富、生态强大
Gson 中小型项目、简单结构 使用简单、学习成本低

⚠️ 建议:根据项目复杂度和团队技术栈选择合适的 JSON 框架。对于性能要求高的场景,建议使用流式解析(如 byteStream() + Jackson 的 JsonParser)避免内存溢出。

完整代码示例可参考:GitHub 示例仓库


原始标题:Decode an OkHttp JSON Response