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 批注并且一切正常。

但是,我不清楚为什么没有它就无法检索值