使用 Retrofit 使用 GSON 获取嵌套 JSON 对象
问题概述:
当使用具有结构化 JSON 响应的 API像:
{ 'status': 'OK', 'reason': 'Everything was fine', 'content': { < some data here > }
其中所需的 POJO 数据嵌套在“内容”字段中,Retrofit 默认情况下将整个 JSON 响应反序列化为具有“状态”和“原因”字段的 POJO,但不是实际的 POJO感兴趣的数据。
自定义反序列化:
至自动提取嵌套内容字段,您可以使用 Gson 创建自定义反序列化器:
Content POJO:
定义一个表示嵌套数据的 POJO 类,例如如:
class Content { public int foo; public String bar; }
反序列化器:
实现 JsonDeserializer
class MyDeserializer implements JsonDeserializer<Content> { @Override public Content deserialize(...) { JsonElement content = je.getAsJsonObject().get("content"); return new Gson().fromJson(content, Content.class); } }
Gson 配置:
使用 GsonBuilder 创建一个 Gson 实例,注册自定义反序列化器:
Gson gson = new GsonBuilder() .registerTypeAdapter(Content.class, new MyDeserializer()) .create();
增强多种类型的反序列化器:
如果您有多种类型的带有“内容”字段的消息,您可以按如下方式概括反序列化器:
class MyDeserializer<T> implements JsonDeserializer<T> { @Override public T deserialize(...) { JsonElement content = je.getAsJsonObject().get("content"); return new Gson().fromJson(content, type); } }
注册此反序列化器的实例适用于您的每种内容类型。
改造集成:
将自定义的 Gson 实例传递给 Retrofit 构建器:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create(gson)) .build();
通过此设置,Retrofit 现在将自动提取“内容”字段并将其解析为适当的内容POJO,无需手动字段提取。
以上是如何使用Retrofit和Gson高效提取嵌套JSON数据?的详细内容。更多信息请关注PHP中文网其他相关文章!