【问题标题】:Parse multiple JSON entries using org.springframework.boot.json.JsonParser使用 org.springframework.boot.json.JsonParser 解析多个 JSON 条目
【发布时间】:2019-05-24 21:15:56
【问题描述】:


我想使用 Spring Boot 中可用的本机 JsonParser 解析 JSON 数组:

String url="https://restservice.com";
RestTemplate restTemplate = new RestTemplate();
String resp = restTemplate.getForObject(url, String.class);

JsonParser springParser = JsonParserFactory.getJsonParser();
Map<String, Object> map = springParser.parseMap(resp);

如果 Array 中只有一项,则此方法有效。如果返回多个项目,则抛出异常:

Caused by: org.springframework.boot.json.JsonParseException: Cannot parse JSON
    at org.springframework.boot.json.AbstractJsonParser.tryParse(AbstractJsonParser.java:60) ~[spring-boot-2.1.0.RELEASE.jar!/:2.1.0.RELEASE]
    at org.springframework.boot.json.JacksonJsonParser.parseMap(JacksonJsonParser.java:55) ~[spring-boot-2.1.0.RELEASE.jar!/:2.1.0.RELEASE]
    at com.example.samplewebapp.DemoApplication.lambda$demo$2(DemoApplication.java:50) [classes!/:0.0.1-SNAPSHOT]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:813) [spring-boot-2.1.0.RELEASE.jar!/:2.1.0.RELEASE]
    ... 13 common frames omitted
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.LinkedHashMap` out of START_ARRAY token

返回 Map JSON 对象列表的正确 API 是什么?

【问题讨论】:

  • 你试过parseList吗?
  • 您能否举例说明您要解析的数据是什么样的?
  • 这意味着你的数据是一个数组。 Cannot deserialize instance of java.util.LinkedHashMap out of START_ARRAY token 如果你能提供输入和预期的输出,帮助你会更容易。 stackoverflow.com/help/mcve

标签: spring-boot


【解决方案1】:

显示您尝试解析的 JSON 将有助于为您的问题找到一个好的答案。

无论如何,如果您要获取列表,则应该改用parseList() 方法。这需要从对象到地图的转换,但对我来说效果很好。这是一个简单的例子:

String json = "[{\"key\":\"value1\"}, {\"key\":\"value2\"}]";
JsonParser springParser = JsonParserFactory.getJsonParser();
List<Object> list = springParser.parseList(json);

for(Object o : list) {
    if(o instanceof Map) {
        Map<String,Object> map = (Map<String,Object>) o;
        //do processing here
    }
}

但是,如果您需要对进程进行更多控制,我建议直接调用所需的解析器(Jackson、gson 等)。 Jackson 提供了一个方便的 ObjectMapper 类来帮助处理这类事情并避免混乱的类型转换。

【讨论】:

  • 非常感谢,这正是我想要的。
  • 没问题!请记住,Spring Boot 使用的“本机 JsonParser”只是它在您的类路径 as seen here 中找到的第一个解析器。因此,可能仍然值得查看这些其他库,以便以后在这种简单的解析方法还不够时,您可以了解如何使用它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2018-08-13
  • 1970-01-01
相关资源
最近更新 更多