首页 > 解决方案 > 在单个 json 对象中将动态字段与普通字段一起改造

问题描述

在我的 android 应用程序中,我使用改造来调用 API 并将响应 json 转换为 My Class。我可以接受简单的回复,但其中一个包含动态字段(需要在列表或地图中收集)。结果 json 的示例如下所示:

{
  "_id":"id",
  "name":"somename",
  "paths":[
             {
               "_id":"path id 1",
               "path":"path 1"
             },
             {
               "_id":"path id 2",
               "path":"path 2"
             }
            ],
  "dynamic_field1":"dynamic_value1",
  "dynamic_field2":"dynamic_value2",
  "dynamic_field3":"dynamic_value3"
}

我应该如何转换这个结果,以便在动态字段旁边有普通字段(在地图或列表中)?

标签: androidkotlingsonretrofit2

解决方案


您可以使用以下方法轻松转换动态键值对Map

像这样创建模型类:

class Response {

   private String id;
   ..

   private final Map<String, String> dynamicValues = new HashMap<>();
   public void addDynamicValues(String key, String value) {
          dynamicValues.put(key, value).
   }
   ....\\ getter setter for methods
}

在您的情况下,我建议您只在 Map 中获取响应,然后循环并获取已知/未知键值。还有另一种方法可以创建自己的 JsonMapper 以进行相应的映射。但是,如果这只是针对单个 API,那么这么多的努力将毫无用处。

 @GET("getResponse/")
 Call<Map<String, Object>> getResponse();

现在使用 Retrofit 执行

 if(response.isSuccessful()) {
            Response apiResponse = new Response();
            Map<String, Object> responseBody = response.body();
            for (Map.Entry<String, Object> entry : responseBody.entrySet()) { 
               System.out.println("Key = " + entry.getKey() + 
                             ", Value = " + entry.getValue());
               if(entry.getKey().equals("_id")) {
                   apiResponse.setId((String) responseBody.get("_id");
               } else if (entry.getKey().equals("name")) {
                   apiResponse.setName((String) responseBody.get("name");
               } else if (entry.getKey().equals("name")){
                  apiResponse.setPaths(responseBody.get("paths");
               } else {
                 apiResponse.addDynamicValues(entry.getKey(), entry.getValue()); 
              }     
          }  
        } else {
            System.out.println(response.errorBody());
 }

推荐阅读