-1

在以下情况下需要帮助 - 使用 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) 方法不起作用?它仅适用于转换为字符串然后加倍。

第二个问题是集合 - 如何解析对象的嵌套集合?

4

2 回答 2

0

因此,经过一番调查,我尝试在我的最终对象的字段上使用 @JSONProperty 注释,这一切都奏效了。

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

于 2020-07-03T11:55:19.507 回答
0

那么对于第一个问题:

你得到一个映射,Map<String, String>所以这个映射的每个值(和每个键)都存储为一个字符串。这就是你有 a 的原因ClassCastException,因为 的值mainRate是 aString并且必须用 解析Double.parseDouble。(顺便说一句。我认为你可以省略,String.valueOf()因为结果respone.get(...)已经是 a String)。

对于第二个问题:这也是可能的,但我建议您尝试另一种方式:

您可以定义一个与响应类型匹配的类。在这种情况下,此类可能如下所示:

public class JsonResponse {
    public double mainRate;
    public List<Map<String, Double>> secondaryRates; // Or also define a object for this

}

然后你可以解析到这个类

JsonResponse response = RestTemplate.getForObject(url, JsonResponse.class);
double mainRate = response.mainRate;
// or other stuff
于 2020-06-29T20:57:56.483 回答