【问题标题】:Jackson + YAML for Not A Number (.NAN)Jackson + YAML for Not A Number (.NAN)
【发布时间】:2021-10-25 13:29:11
【问题描述】:

根据 YAML 规范,非数字表示为 .NAN https://yaml.org/refcard.html

但是,当使用jackson-dataformats-textYAMLMapper 反序列化时,我们得到:

格式错误的数值“.NAN”

你如何告诉ObjectMapper 接受给定的字符串作为代表空值而不深入到自定义反序列化器?还是我应该启用 YAML 特定的功能?

如果您使用NULL,它可以在 Jackson 端工作,但它不再是有效的 YAML 并且像 VS Code 这样的模式感知编辑器知道它,这会让最终用户感到困惑:

【问题讨论】:

  • 这里的问题是它期待一个整数,但 NaN 不是整数?可以省略吗?
  • 是的,@AndyTurner - 它需要一个数字类型。我不能省略它,因为 a) 这有点像 DSL,我希望允许用户显式与隐式,并且 b) 在某些情况下,即使缺少值,我也需要定义键

标签: java jackson jackson-dataformat-yaml


【解决方案1】:

我通过绕过YAMLMapper 并直接转到SnakeYAML 的Yaml 解决了这个问题。我这样做是为了解决 Jackson 没有解决锚点的问题,但后来我意识到它也解决了 .NaN/null 问题 - .NaNs 现在被正确解析为 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);
}

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 2020-03-06
    • 2020-01-30
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多