在现代应用程序中,经常会遇到具有嵌套 JSON 结构的 API 响应。当您想要使用嵌套层次结构中的特定数据字段时,这可能会带来挑战。本指南将演示如何创建自定义 Gson 反序列化器,以使用 Retrofit 从嵌套 JSON 对象中提取所需内容。
考虑具有以下结构的 API 响应:
{ 'status': 'OK', 'reason': 'Everything was fine', 'content': { < real data here > } }
您有带有状态和原因字段的 POJO,但您需要的数据驻留在嵌套内容对象中。
要提取嵌套内容,您将创建一个包装实际 POJO 反序列化器的自定义反序列化器。它的工作原理如下:
class MyDeserializer implements JsonDeserializer<Content> { @Override public Content deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) { // Get the "content" element from the parsed JSON JsonElement content = je.getAsJsonObject().get("content"); // Deserialize it using a new Gson instance to avoid recursion return new Gson().fromJson(content, Content.class); } }
Gson gson = new GsonBuilder() .registerTypeAdapter(Content.class, new MyDeserializer()) .create();
Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create(gson)) .build();
现在,您可以反序列化 API 响应并访问使用 Retrofit 将嵌套内容直接作为 Content 对象。
如果您有多种类型的消息共享“内容”字段,您可以创建一个通用反序列化器,如下所示:
class MyDeserializer<T> implements JsonDeserializer<T> { @Override public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) { // Get the "content" element from the parsed JSON JsonElement content = je.getAsJsonObject().get("content"); // Deserialize it using a new Gson instance to prevent recursion return new Gson().fromJson(content, type); } }
为您的每种内容类型注册此反序列化器。 Retrofit 将根据 API 响应的类型自动使用适当的反序列化器。
以上是如何使用 Gson 和 Retrofit 从 API 响应中提取嵌套 JSON 对象?的详细内容。更多信息请关注PHP中文网其他相关文章!