首页 > 解决方案 > 解析 `NaN` Json.parse 配置

问题描述

我正在尝试NaN使用 Scala 中的 play-json 解析 JSON 对象。

import play.api.libs.json._
val s = """{"a": NaN}"""
val p = Json.parse(s)

这与错误

com.fasterxml.jackson.core.JsonParseException:非标准令牌“NaN”:启用 JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS 以允许在 [Source: {"a": NaN}; 行:1,列:10]
com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1702) com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:558) com.fasterxml.jackson.core.json.ReaderBasedJsonParser。 _handleOddValue(ReaderBasedJsonParser.java:1884) com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:749) play.api.libs.json.jackson.JsValueDeserializer.deserialize(JacksonJson.scala:179) 播放。 api.libs.json.jackson.JsValueDeserializer.deserialize(JacksonJson.scala:128) play.api.libs.json.jackson.JsValueDeserializer.deserialize(JacksonJson.scala:123) com.fasterxml.jackson.databind.ObjectMapper._readValue( ObjectMapper.java:3786) com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2115) play.api.libs.json.jackson.JacksonJson$.parseJsValue(JacksonJson.scala:235) play.api.libs.json.StaticBinding$.parseJsValue(StaticBinding.scala:16) play.api.libs.json.Json$.parse(Json.scala:171)

问:我不确定我应该在哪里启用配置以允许非标准解析。

(scala 2.11,com.typesafe.play:play-json_2.11:2.6.9)

标签: jsonscalaplayframeworkplay-json

解决方案


您有 2 个选择:

1)为你启用ALLOW_NON_NUMERIC_NUMBERS杰克逊映射器 - 看起来它不支持通过play-json,但如果你“手动”解析json,你可以控制它,就像这样:

import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.ObjectMapper
import org.json4s._
import org.json4s.jackson.Json4sScalaModule

val jsonString = """{"price": NaN}"""

val mapper = new ObjectMapper()
// Configure NaN here
mapper.configure(JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS, true)
mapper.registerModule(new Json4sScalaModule)

val json = mapper.readValue(jsonString, classOf[JValue])

2)修改json并将所有NaN子字符串转换为null。然后用 play-json 解析它。


推荐阅读