【问题标题】:JSON Map collection to ArrayListJSON 映射集合到 ArrayList
【发布时间】:2020-06-29 20:43:43
【问题描述】:

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

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

【问题讨论】:

    标签: java json resttemplate


    【解决方案1】:

    所以到第一个问题:

    你得到一个Map&lt;String, String&gt; 的映射,所以这个映射的每个值(和每个键)都存储为一个字符串。这就是你得到ClassCastException 的原因,因为mainRate 的值是String,必须用Double.parseDouble 解析。 (顺便说一句。我认为您可以省略String.valueOf(),因为respone.get(...) 的结果已经是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
    

    【讨论】:

    • 不幸的是集合在主对象内,如果我这样做 RestTemplate.getForObject(url, Response.class) 我得到一个全为空的响应对象
    • 好的,我忽略了它是一个集合并更正了我的答案。但通常这不应该给一个带有所有空值的对象。字段名称与 JSON 的键匹配很重要,因此变量名为 mainRate 而不是 mainrate 或其他名称很重要。但如果这真的不起作用,你可以看看这个:baeldung.com/rest-template,这里解释了如何使用实际的 JSON 解析器解析它 (Jackson)
    【解决方案2】:

    所以,经过一番调查,我尝试在我的最终对象的字段上使用 @JSONProperty 注释,并且一切正常。

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

    【讨论】:

      猜你喜欢
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多