如何使用gson自动映射json字典

时间:2017-05-30 09:16:20

标签: android json retrofit2 gson

设定: - Android - 改造2 - Gson

我的服务器json看起来像这样:

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

第一个节点:“myList1”和“myList2”已修复。

然后第二个节点包含一个变量号

第二个节点用户对象。

- &GT;如何使用gson定义第二个列表的响应?

- &GT;条目的数量和数量是可变的

我的响应映射看起来像:

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;
}

1 个答案:

答案 0 :(得分:1)

如果您可以控制API,最简单的解决方案是将响应格式转换为

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

如果不这样做,则可以使用自定义TypeAdapter解析它。

将您的回复def更改为

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;
}

并创建自定义TypeAdapter为

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;
    }
}

然后,您可以使用

向Gson注册类型适配器
Gson gson = new GsonBuilder()
                .registerTypeAdapter(ResponseDef.class, new CustomAdapter())
                .create();