JSON 将集合映射到 ArrayList
JSON Map collection to ArrayList
在以下情况下需要帮助 - 使用 RestTemplate 我通过以下方式从内部服务器获得响应:
Map<String, String> response = RestTemplate.getForObject(url, Map.class);
响应的结构是:
"mainRate" -> 2.99000 // double
"secondaryRates" -> [{rateName -> r1, rateVal -> 5.9}] //ArrayList of LinkedHashMap<String, Double>
第一个问题 - 我无法以简单的方式从地图结果中读取:
double mainRate = response.get("mainRate")
这会产生 ClassCastException。不知道为什么?有人有这样的情况吗?相反,我这样做:
double mainRate = Double.parseDouble(String.valueOf(response.get("mainRate")));
请告知为什么 response.get(keyName) 的简单方法不起作用?它仅适用于转换为 String 然后再转换为 double。
第二个问题是集合 - 如何解析对象的嵌套集合?
所以第一期:
您得到了 Map<String, String>
的映射,因此该映射的每个值(和每个键)都存储为字符串。这就是为什么你有一个 ClassCastException
,因为 mainRate
的值是一个 String
并且必须用 Double.parseDouble
来解析。 (顺便说一句。我认为你可以省略 String.valueOf()
因为 respone.get(...)
的结果已经是 String
)。
第二期:
这也是可以的,但我建议您换一种方式尝试:
您可以定义与响应类型匹配的 class。
在这种情况下,此 class 可能如下所示:
public class JsonResponse {
public double mainRate;
public List<Map<String, Double>> secondaryRates; // Or also define a object for this
}
然后你可以像
这样解析这个class
JsonResponse response = RestTemplate.getForObject(url, JsonResponse.class);
double mainRate = response.mainRate;
// or other stuff
因此,经过一些调查后,我尝试在我的最终对象的字段上使用 @JSONProperty 批注并且一切正常。
但是,我不清楚为什么没有它就无法检索值
在以下情况下需要帮助 - 使用 RestTemplate 我通过以下方式从内部服务器获得响应:
Map<String, String> response = RestTemplate.getForObject(url, Map.class);
响应的结构是:
"mainRate" -> 2.99000 // double
"secondaryRates" -> [{rateName -> r1, rateVal -> 5.9}] //ArrayList of LinkedHashMap<String, Double>
第一个问题 - 我无法以简单的方式从地图结果中读取:
double mainRate = response.get("mainRate")
这会产生 ClassCastException。不知道为什么?有人有这样的情况吗?相反,我这样做:
double mainRate = Double.parseDouble(String.valueOf(response.get("mainRate")));
请告知为什么 response.get(keyName) 的简单方法不起作用?它仅适用于转换为 String 然后再转换为 double。
第二个问题是集合 - 如何解析对象的嵌套集合?
所以第一期:
您得到了 Map<String, String>
的映射,因此该映射的每个值(和每个键)都存储为字符串。这就是为什么你有一个 ClassCastException
,因为 mainRate
的值是一个 String
并且必须用 Double.parseDouble
来解析。 (顺便说一句。我认为你可以省略 String.valueOf()
因为 respone.get(...)
的结果已经是 String
)。
第二期: 这也是可以的,但我建议您换一种方式尝试:
您可以定义与响应类型匹配的 class。 在这种情况下,此 class 可能如下所示:
public class JsonResponse {
public double mainRate;
public List<Map<String, Double>> secondaryRates; // Or also define a object for this
}
然后你可以像
这样解析这个classJsonResponse response = RestTemplate.getForObject(url, JsonResponse.class);
double mainRate = response.mainRate;
// or other stuff
因此,经过一些调查后,我尝试在我的最终对象的字段上使用 @JSONProperty 批注并且一切正常。
但是,我不清楚为什么没有它就无法检索值