Jackson + YAML 表示非数字 (.NAN)
Jackson + YAML for Not A Number (.NAN)
根据 YAML 规范,Not-a-number 表示为 .NAN
https://yaml.org/refcard.html
但是,当使用 jackson-dataformats-text
的 YAMLMapper
反序列化时,我们得到:
Malformed numeric value '.NAN'
如何告诉 ObjectMapper
接受给定字符串作为 null 的表示而不深入研究自定义反序列化器?或者是否有我应该启用的 YAML-specific 功能?
如果你使用 NULL
,它可以在 Jackson 端工作,但它不再有效的 YAML 和 schema-aware 像 VS Code 这样的编辑器知道它,这让最终用户感到困惑:
我已经通过绕过 YAMLMapper
并直接转到 SnakeYAML 的 Yaml
解决了这个问题。我这样做是为了解决 Jackson 不解析锚点的问题,但后来我意识到它也解决了 .NaN
/null 问题 - .NaN
s 现在被正确解析为 Double.NaN
static final Yaml YAML = new Yaml();
static final ObjectMapper MAPPER = new ObjectMapper();
...
// Use SnakeYAML directly to resolve anchors and handle .NaN
protected static <T> T load(Path p, Class<T> cls) throws IOException {
val yaml = YAML.load(Files.newInputStream(p));
return MAPPER.treeToValue(MAPPER.valueToTree(yaml), cls);
}
根据 YAML 规范,Not-a-number 表示为 .NAN
https://yaml.org/refcard.html
但是,当使用 jackson-dataformats-text
的 YAMLMapper
反序列化时,我们得到:
Malformed numeric value '.NAN'
如何告诉 ObjectMapper
接受给定字符串作为 null 的表示而不深入研究自定义反序列化器?或者是否有我应该启用的 YAML-specific 功能?
如果你使用 NULL
,它可以在 Jackson 端工作,但它不再有效的 YAML 和 schema-aware 像 VS Code 这样的编辑器知道它,这让最终用户感到困惑:
我已经通过绕过 YAMLMapper
并直接转到 SnakeYAML 的 Yaml
解决了这个问题。我这样做是为了解决 Jackson 不解析锚点的问题,但后来我意识到它也解决了 .NaN
/null 问题 - .NaN
s 现在被正确解析为 Double.NaN
static final Yaml YAML = new Yaml();
static final ObjectMapper MAPPER = new ObjectMapper();
...
// Use SnakeYAML directly to resolve anchors and handle .NaN
protected static <T> T load(Path p, Class<T> cls) throws IOException {
val yaml = YAML.load(Files.newInputStream(p));
return MAPPER.treeToValue(MAPPER.valueToTree(yaml), cls);
}