【问题标题】:Parsing of YAML file with Jackson fails if value starts with special character如果值以特殊字符开头,则使用 Jackson 解析 YAML 文件失败
【发布时间】:2021-07-31 18:28:16
【问题描述】:

我正在尝试解析以下 YAML 内容:

template:
    amplitude: 5
    noise: +-0.01  

此异常失败:

com.fasterxml.jackson.databind.JsonMappingException: empty String (through reference chain: ... ->my.package.Template["noise"])

Template 类包含 noise 类型的属性 FlexValue。我制作了一个自定义的JsonDeserializer,它负责解析这种类型的属性的值。该符号允许一些花哨的表达式,因此该类型的名称为FlexValue。此示例中的值“+-0.01”是解串器的有效输入。但是,似乎甚至没有调用解串器。 似乎在此之前抛出了异常。

这是我的自定义反序列化器的相关类定义:

class FlexValueParser : JsonDeserializer<FlexValue>() {

    override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): FlexValue {
        //...
    }

}

自定义反序列化器注册如下:

@JsonDeserialize(using = FlexValueParser::class)
class FlexValue {
    // ...
}

此设置似乎工作正常。它也适用于其他类型,它们的解析方式不同。

如果我在“+-”之前添加一个“0”,这也是一个有效的输入,它可以工作:

template:
    amplitude: 5
    noise: 0+-0.01

“+-”是 YAML 中的一个特殊字符,它会导致 Jackson 无法解析它,因为它试图做的事情超出了我的预期?我希望它将输入“+-0.01”视为String,因为它不代表有效的数字输入。

当我使用noise: ~0.01 时,也会出现同样的问题,这也是我的反序列化器的有效输入。相同的异常被抛出,并且可以通过在卷曲的“~”之前添加一个“0”来避免。

有人可以给我一个提示吗?

【问题讨论】:

  • +- 在 YAML 中没有特殊含义,您得到的异常意味着它被正确解析并且数据绑定失败。我不知道为什么会发生这种情况,这似乎是数据映射器中的一个错误,因为当您提供自定义反序列化器时,那​​里不应该发生任何可能导致此错误的事情。
  • 感谢您的回复。所以你的意思是在杰克逊回购中为这个问题提交一个错误会很好?
  • 当然。至少,错误消息 empty string 是错误的,应该修复。
  • 好的。既然您已经回答了我的问题,我想将您的回答标记为已接受。因此,如果您愿意,请重新发布您之前的评论作为答案。

标签: kotlin jackson yaml jackson-databind


【解决方案1】:

找到了问题的根源,与Jackson或YAML无关。因此结束这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多