Extracting Nested JSON with a Custom Gson Converter in Retrofit
Many APIs provide responses with a common JSON structure where a root object encompasses a nested "content" field containing the desired data. However, most POJOs model only the data within the "content" field, leaving the retrofit type adapter unable to extract and return the appropriate object.
To address this, a custom Gson deserializer can be developed to extract the "content" field and return the embedded object. Here's how:
Custom Deserializer:
Create a class implementing the JsonDeserializer interface for the desired POJO type. For example, for a "Content" POJO:
class ContentDeserializer implements JsonDeserializer{ @Override public Content deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException { // Extract the "content" element JsonElement content = je.getAsJsonObject().get("content"); // Deserialize the content using a new Gson instance return new Gson().fromJson(content, Content.class); } }
Gson Configuration:
Register the custom deserializer with a GsonBuilder instance:
Gson gson = new GsonBuilder() .registerTypeAdapter(Content.class, new ContentDeserializer()) .create();
This Gson instance can now be used to deserialize JSON responses directly to the embedded "Content" object.
Retrofit Integration:
Finally, use the custom Gson converter when creating the Retrofit instance:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create(gson)) .build();
Now, when Retrofit deserializes API responses, it will use the custom converter to extract only the "content" field and return the appropriate POJO type.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3