Mikhail
Mikhail

Reputation: 3746

Custom retrofit json deserializer

I've been using Retrofit library recently and I like it so far. However, I've come across API that returns response with the following structure:

"data": 
{
    "meta": 
    {
        "code": 200
        "data": "data"
    },
    "body": [
        {
            "id": "id",
            "field1": "data",
            "field2": "data"
        },
        {
            "id": "id",
            "field1": "data",
            "field2": "data"
        }]
}

Assuming I have following class:

public class Entity {
    long id;
    String field1;
    String field2;
}

and following interface:

public interface EntityService {

    @GET("/api/method")
    void getEntities(Callback<List<Entity>> callback);
}

what is the correct way to use Retrofit if I want to get a list of Entity objects from data.body element from response? I know I could have passed Response object in the callback and manually parse it using org.json package or something else, but is there any better way?

Upvotes: 0

Views: 784

Answers (2)

M&#233;d&#233;ric
M&#233;d&#233;ric

Reputation: 948

It seems that extra data in your result could be re-used. You should use a generic class like this one:

public class Data<E> {

    Meta meta;
    E body;

    public static class Meta {
        int code;
        String data;
    }
}

Then you could use

Data<List<Entity>> 

or whatever you want:

public interface EntityService {

    @GET("/api/method")
    void getEntities(Callback<Data<List<Entity>>> callback);
}

Upvotes: 1

roarster
roarster

Reputation: 4086

Why not just make a class that represents the data like you've already half done? That's what I've done in multiple apps along with other developers:

public class Meta {
    String code;
    String data;
}

public class Data {
    Meta meta;
    List<Entity> body;
}

public interface EntityService {
    @GET("/api/method")
    void getEntities(Callback<Data> callback);
}

Upvotes: 1

Related Questions