Home >Java >javaTutorial >How to Extract Nested JSON Objects from Retrofit Responses using Custom GSON Deserializers?
Extracting Nested JSON Objects with GSON in Retrofit
When consuming an API that responds with JSON objects containing nested data, it can become challenging to extract and operate on the relevant data directly. This is particularly true when the desired data is buried within an intermediary "content" field.
To overcome this hurdle, GSON provides a mechanism for creating custom deserializers, which can be used to extract specific fields from the response JSON.
Creating a Custom Deserializer
To create a custom deserializer, define a new class implementing the JsonDeserializer interface, as shown below:
class MyDeserializer implements JsonDeserializer<Content> { @Override public Content deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException { // Get the "content" element from the parsed JSON JsonElement content = je.getAsJsonObject().get("content"); // Deserialize it. Use a new instance of Gson to avoid infinite recursion return new Gson().fromJson(content, Content.class); } }
Generic Deserializer for Different Content Types
If you have different types of messages but all share a "content" field, you can create a generic deserializer:
class MyDeserializer<T> implements JsonDeserializer<T> { @Override public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException { // Get the "content" element from the parsed JSON JsonElement content = je.getAsJsonObject().get("content"); // Deserialize it. Use a new instance of Gson to avoid infinite recursion return new Gson().fromJson(content, type); } }
Registering the Deserializer in Retrofit
Once the deserializer is created, register it with the GsonConverterFactory when creating a Retrofit instance:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create(gson)) .build();
Example Usage:
With the custom deserializer in place, you can now deserialize the JSON response directly into the desired POJO:
Content c = gson.fromJson(myJson, Content.class);
By utilizing custom deserializers, you gain the flexibility to tailor the JSON parsing process to your specific needs, allowing you to easily access and manipulate nested data within the JSON responses.
The above is the detailed content of How to Extract Nested JSON Objects from Retrofit Responses using Custom GSON Deserializers?. For more information, please follow other related articles on the PHP Chinese website!