[英]Error parsing YAML file using Jackson APIs
我有一个如下定义的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的实例
反序列化程序尝试从您的YAML输入创建一个LinkedHashMap
。 这样做是因为您告诉它应该将内容读入Map.class
,而LinkedHashMap
恰好是反序列化器使用的Map
实现。
现在,当尝试创建此类Map
,反序列化程序在解析YAML时遇到的第一个令牌是START_ARRAY
令牌。 这是某个地方的命名错误,因为YAML具有序列 ,而不是array 。 但是很明显会发生什么:YAML文件的根节点是一个序列 (它包含两个以-
开头的块序列节点)。 反序列化器不知道如何将YAML序列反序列化为LinkedHashMap
,因此会出现错误。
要解决此问题,请反序列化为List
或将YAML更改为包含YAML 映射作为根节点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.