如何配置Jackson的YAMLMapper支持解析YAML规范中的.NAN值?
配置方法
你可以通过开启Jackson内置的YAML解析特性和全局类型强制转换规则实现需求,不需要自定义反序列化器:
- 首先开启YAML专属的
ALLOW_NAN解析特性,该特性默认关闭,开启后即可兼容YAML规范定义的.NAN、.INF、-.INF等非数值表示,不会再抛出Malformed numeric value '.NAN'错误。 - 再开启非数值转null的强制转换配置,即可将解析到的
.NAN自动转为null值。
代码示例(Jackson 2.14及以上版本)
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLParser; import com.fasterxml.jackson.databind.DeserializationFeature; // 构建YAMLMapper实例 YAMLMapper yamlMapper = YAMLMapper.builder() // 开启YAML规范非数值解析支持 .enable(YAMLParser.Feature.ALLOW_NAN) // 开启非数值强制转null配置 .enable(DeserializationFeature.COERCE_NAN_TO_NULL) .build();
兼容低版本Jackson的配置
如果使用的Jackson版本低于2.14,没有内置的COERCE_NAN_TO_NULL特性,可以通过全局 coercion 规则配置实现相同效果:
import com.fasterxml.jackson.databind.cfg.CoercionAction; import com.fasterxml.jackson.databind.cfg.CoercionInputShape; YAMLMapper yamlMapper = YAMLMapper.builder() .enable(YAMLParser.Feature.ALLOW_NAN) .build(); // 全局配置浮点数类输入(含.NAN)强制转null yamlMapper.coercionConfigDefaults() .setCoercion(CoercionInputShape.FLOAT, CoercionAction.AsNull);
配置完成后,你就可以使用符合YAML规范的.NAN写法,既不会触发VS Code等编辑器的Schema校验错误,Jackson也能正常将该值反序列化为null。
内容的提问来源于stack exchange,提问作者J. Dimeo
相关产品推荐
相关产品推荐

