【问题标题】:How to map json dictionary automatically with gson如何使用 gson 自动映射 json 字典
【发布时间】:2017-05-30 09:16:20
【问题描述】:

设置: - 安卓 - 改造 2 - 格森

我的服务器 json 如下所示:

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

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

那么第二个节点包含一个变量号

第二个节点持有一个用户对象。

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

->条目的数量和计数是可变的

我的响应映射如下:

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

【问题讨论】:

标签: android json retrofit2 gson


【解决方案1】:

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

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

如果你不这样做,那么你可以使用自定义的 TypeAdapter 来解析它。

将您的响应定义更改为

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多