0

Setup: - Android - Retrofit 2 - Gson

My Server json looks like this:

{
 "myList1": 
  {
   "1": (<- variable number)
    {
      "id":"1","name":"user123"
    }, 
   "2"{},...}, 
 "myList2": 
  {
   "299": (<- variable number)
    {
     "id":"20","name":"user42"
    }, 
   "300":
   {},...}
}

The first node: "myList1" and "myList2" is fix.

Then the second node contains a variable number

And the second node holdes an user object.

-> How do I define the response for the second list with gson?

-> The number and the count of the entries is variable

My Response Mapping looks like:

public class ResponeDef {
   @Gson.Named("myList1")
   ResponeListDef list1;

   @Gson.Named("myList2")
   ResponeListDef list1;
}

public class ResponeListDef {
   @Gson.Named("??")
   ResponeListEntryDef entry1

   @Gson.Named("??")
   ResponeListEntryDef entry2;
}

public class ResponeListEntryDef {
   @Gson.Named("id")
   int id;

   @Gson.Named("name")
   String userName;
}
Community
  • 1
  • 1
true-mt
  • 347
  • 3
  • 12

1 Answers1

1

If you have control over the API, the easiest solution would be to convert the response format to

{
 "myList1": 
  [
    {
      "id":"1","name":"user123"
    }, 
   {},...], 
 "myList2": 
  [
    {
     "id":"20","name":"user42"
    },
   {},...]
}

If you do not, then you can parse this using a custom TypeAdapter.

Change your response def to

public class ResponeDef {
   @Gson.Named("myList1")
   List<ResponseListEntryDef> list1;

   @Gson.Named("myList2")
   List<ResponseListEntryDef> list1;
}

public class ResponeListEntryDef {
   @Gson.Named("id")
   int id;

   @Gson.Named("name")
   String userName;
}

and create a custom TypeAdapter as

class CustomAdapter extends TypeAdapter<ResponseDef> {

    @Override
    public void write(JsonWriter out, ResponseDef value) throws IOException {
        // loop over lists and write them to out
    }

    @Override
    public ResponseDef read(JsonReader in) throws IOException {
        // loop over items in jsonReader and initialize the lists
        return responseDef;
    }
}

You can then register the type adapter with Gson with

Gson gson = new GsonBuilder()
                .registerTypeAdapter(ResponseDef.class, new CustomAdapter())
                .create();
Anuj
  • 1,912
  • 1
  • 12
  • 19