繁体   English   中英

跳过或忽略 Jackson 的 YAML 解析错误

[英]Skip or ignore YAML parsing errors with Jackson

我正在尝试解析从另一个系统(PHP 应用程序)下载的 Java 应用程序中的大型 YAML 文件(超过 3000 行)。 我对 YAML 文件本身的控制有限。 对它的更改是手动完成的,另一个系统中的 YAML 解析器似乎对 YAML 的格式更加宽容。

我遇到的问题是,当我尝试用 Jackson 解析文件时,我得到一个异常,因为少数行的末尾有一个无效字符。 这会导致整个解析尝试失败。

有没有办法配置或设置 Jackson 以在行或 YAML 块格式错误或具有无效令牌时简单地跳过它们?

示例 YAML

example.good_yaml:
  description: "Example of good YAML"
example.bad_yaml:
  description: "Example of bad YAML")

解析代码

ObjectMapper mapper = new YAMLMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Map<String, Object> result = mapper.readValue(sourceYaml, new TypeReference<Map<String, Object>>() {});

错误

com.fasterxml.jackson.dataformat.yaml.snakeyaml.error.MarkedYAMLException: while parsing a block mapping
 in 'reader', line 4, column 3:
      description: "Example of bad YAML")
      ^
expected <block end>, but found '<scalar>'
 in 'reader', line 4, column 37:
      description: "Example of bad YAML")
                                        ^

 at [Source: (File); line: 4, column: 37]

这将需要杰克逊用于解析的 SnakeYAML 来支持这一点。 加载选项不包括此设置,我也不知道它的任何 API,所以我很确定它没有任何此类功能。

请注意,从语法错误中恢复是一项相当复杂的工作(尽管对于您的特定用例来说似乎很简单),而且我不知道有任何 YAML 实现可以实现这一点(因为它们中的大多数是 PyYAML/libyaml 的重写)。

假设有少量重复的语法错误可以通过 RegEx 轻松发现,那么使用位置良好的sed命令清理文件可能会更容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM