【发布时间】:2021-01-02 01:35:58
【问题描述】:
将这个从 GitHub 移到这里,因为 Spring 团队仅将 GitHub 问题用于错误和功能请求。
根据 Spring Boot documentation,应该可以使用环境属性(例如在 application.properties 中)自定义 Jackson ObjectMapper,例如 spring.jackson.parser.<feature_name>,只要您不定义自己的 ObjectMapper豆子。
我需要激活 ALLOW_NON_NUMERIC_NUMBERS 解析器功能,因为我正在获取带有 NaN 浮点字段值的 JSON(严格来说是无效的),我希望 Jackson 在 Java 中映射到 java.lang.Double.NaN。
所以在我的application.properties 中,我添加了spring.jackson.parser.ALLOW_NON_NUMERIC_NUMBERS=true,我可以看到它正在被接收:
- Spring Boot 的
JacksonAutoConfiguration正在创建一个Jackson2ObjectMapperBuilder -
Jackson2ObjectMapperBuilder的StandardJackson2ObjectMapperBuilderCustomizer正在获取我的spring.jackson.parser.ALLOW_NON_NUMERIC_NUMBERS=true属性并将其添加到其features地图中 -
Jackson2ObjectMapperBuilder的build()方法最终调用configureFeature,这导致ALLOW_NON_NUMERIC_NUMBERS功能 (512) 的掩码值被添加到ObjectMapper的JsonFactory中的_parserFeatures值 -
ObjectMapper使用@Autowired注入到我的 bean 中也启用了ALLOW_NON_NUMERIC_NUMBERS功能
尚不清楚为什么我在解析具有浮点字段 NaN 值的 JSON 时仍然收到以下 Jackson 错误:
JSON decoding error: Character N is neither a decimal digit number, decimal point, nor "e" notation exponential mark.
我现在正在调试,所以我可能最终会回答我自己的问题。以上细节可能会帮助来自the GitHub issue 的人找到一个线程,以防他们的功能标志未被应用。
【问题讨论】:
-
您可以使用
Number,而不是使用BigDecimal作为类型。当您启用DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS功能时,Jackson将为浮点数创建BigDecimal实例。在代码中,您可以创建额外的 gettergetValueAsBigDecimal并将Number实例转换为BigDecimal或强制转换。如果是NaN,它将是一个Decimal实例,如果需要,您可以返回null。
标签: spring-boot jackson