使用Jackson API解析YAML文件时出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Jackson API解析YAML文件时出错相关的知识,希望对你有一定的参考价值。

我有一个YAML文件定义如下。我确认它是一个有效的YAML文件。但是,我得到了下面提到的例外情况。

由于YAML是一个有效的文件,我不知道缺少什么导致异常。有人可以提供一些提示我需要更改以解决此问题吗?

#========================================================================

# Test Context

- transaction:
    request:
      method: populate_db
      params:
        param1: param-value-1
    response:
      result: database1
      error: null

- transaction:
    request:
      method: updateTable
      params:
        param1: database1
    response:
      result: schema
      error: null

#========================================================================

我写的解串器代码如下。

public class TestScriptDeserializer {

    private static final Logger logger = LoggerFactory.getLogger(TestScriptDeserializer.class.getName());
    private static final long serialVersionUID = 1L;

    public static Map<String, Object> deserialize(String yamlFile) {

        ObjectMapper yamlReader = new ObjectMapper(new YAMLFactory());    
        try {
            final Map<String, Object> testScriptObj = yamlReader.readValue(new File(yamlFile), Map.class);

            if (testScriptObj != null) {
                return testScriptObj;
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("Test Script deserialization failed");
            return null;
        }

        return null;
    }
}

当我运行此代码时,我收到以下错误。

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token
 at [Source: (File); line: 6, column: 1]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
    at com.fasterxml.jackson.databind.DeserializationContext.reportMappingException(DeserializationContext.java:1234)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1122)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1075)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromEmpty(StdDeserializer.java:892)
    at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:358)
    at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:27)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3814)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2756)
    at com.project.automation.utils.parser.TestScriptDeserializer.deserialize(TestScriptDeserializer.java:27)
答案

错误消息表明错误:

无法从START_ARRAY标记中反序列化java.util.LinkedHashMap的实例

deserialiser尝试从您的YAML输入创建LinkedHashMap。这样做是因为你告诉它它应该将内容读入Map.class,而LinkedHashMap恰好是deserialiser使用的Map实现。

现在,在尝试创建这样的Map时,deserialiser在解析YAML时遇到的第一个标记是START_ARRAY标记。这是一个命名错误,因为YAML有序列,而不是数组。但很明显会发生什么:YAML文件的根节点是一个序列(它包含两个块序列节点,每个节点以-开头)。解串器不知道如何将YAML序列反序列化为LinkedHashMap,因此错误。

要修复它,要么反序列化为List,要么更改YAML以包含作为根节点的YAML映射。

以上是关于使用Jackson API解析YAML文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

yaml 解析时出错。预期 <block end>,但找到 <scalar>

使用 Proguard 处理 Jackson 库后混淆时出错

Google App Engine“解析./app.yaml时出错:未知的url处理程序类型”

Google App Engine Node.js 应用程序 - “解析 app.yaml 时出错:未知 url 处理程序类型”

使用 Jackson 将 Java 对象实例写入 YAML

MailChimp Api,解析图像时出错