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 示例仓库