1. 简介
在本教程中,我们将探讨使用OkHttp解码JSON响应的几种技术。
2. OkHttp响应
OkHttp是适用于Java和Android的HTTP客户端,具有透明处理GZIP、响应缓存和网络问题恢复等功能。
尽管有这些很棒的功能,OkHttp并没有内置JSON、XML和其他内容类型的编码器/解码器。但是,我们可以借助XML/JSON绑定库来实现这些功能,或者我们可以使用Feign或Retrofit等高级库。
要实现JSON解码器,我们需要从服务调用的结果中提取JSON。为此,我们可以通过Response对象的body()方法访问主体,ResponseBody类有几种提取此数据的选项:
- byteStream():将主体的原始字节作为InputStream公开;我们可以将其用于所有格式,但通常用于二进制文件和文件。
- charStream():当我们有文本响应时,charStream()将其InputStream包装在Reader中,并根据响应的内容类型处理编码,如果响应标头中未设置字符集,则处理“UTF-8”;但是,当使用charStream()时,我们无法更改Reader的编码。
- string():以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("Tuyucheng");
OkHttpClient client = // build an instance;
MockWebServer server = // build an instance;
Request request = new Request.Builder().url(server.url("...")).build();
3. 使用Jackson解码ResponseBody
Jackson是最流行的JSON对象绑定库之一。
让我们将jackson-databind添加到pom.xml中:
<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响应的几种方法。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章
