android - 在单个 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"
}
我应该如何转换这个结果,以便在动态字段旁边有普通字段(在地图或列表中)?
解决方案
您可以使用以下方法轻松转换动态键值对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());
}
推荐阅读
- r - 使用绘图功能时收到警告消息
- c# - Unity 将游戏对象转移到另一个场景
- python - 从 digist 和 alpha 生成字符串
- xamarin.android - 无法垂直居中 ImageButton
- python - Python:从文件中读取包括 \n \t。问题是我的文件也有 \n \t 作为文本的一部分
- validation - 方法 requestClass::validate 不存在。如何调用正确的提供者?
- javascript - 单击按钮后如何删除 eventListener?
- c# - PauseMenu - FPS 相机在 PauseMenu 中仍然移动
- sqlite - 我将如何返回表中所有行的计数,然后返回每次找到特定状态的计数?
- ios - 将 sms.db sql 数据库从 iOS 10 合并/迁移到 iOS 12