2

I am trying to parse a JSON object with a NaN using play-json in Scala.

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

This errors with

com.fasterxml.jackson.core.JsonParseException: Non-standard token 'NaN': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS to allow at [Source: {"a": NaN}; line: 1, column: 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)

Question: I am not sure where should I enable the configuration to allow non-standard parsing.

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

armundle
  • 1,149
  • 2
  • 15
  • 28
  • 1
    [Since Play doesn't support NaN](https://github.com/playframework/playframework/issues/1513), I would avoid this wherever possible. You shouldn't be using or expecting NaN in Scala or Play. – James Whiteley Apr 11 '19 at 08:09
  • 1
    This is part of a request object I want to parse. – armundle Apr 11 '19 at 13:48

1 Answers1

2

You have 2 choices:

1) Enable the ALLOW_NON_NUMERIC_NUMBERS for you jackson mapper - looks like it's not supported through play-json, but if you parse the json "manually", you can control it, like that:

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) Modifying the json and convert all NaN substrings to null. Then parse it with play-json.

Gal Naor
  • 2,397
  • 14
  • 17