Разбор `NaN` конфигурации Json.parse - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь проанализировать объект JSON с NaN, используя play-json в Scala.

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, чтобы разрешить в [Источник: {"а": 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) play.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)

1 Ответ

1 голос
/ 11 апреля 2019

У вас есть 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 в ноль. Тогда разбери его с play-json.

...