3

I am using Scalatra, which in turn uses Json4S to generate Json string. I receive

["A","B"]

for

List(Some("A"),None,Some("B"))

I would like to receive

["A",undefined,"B"]

How can this be fixed ?

2
  • Why do you want that undefined in there? How could the receiver of that information possible benefit from having an undefined in there vs just not having that element in the array? Commented Jun 1, 2013 at 13:34
  • 1
    When I serialise an array with 3 elements, I am expecting to receive a new array with 3 elements. Moreover: List(Some("A"),None,Some("B")) <> List(Some("A"),Some("B"),None) while the serialised arrays are equivalent !!! I reckon this is a bug in Json4S library. Commented Jun 2, 2013 at 2:34

1 Answer 1

1

undefined is not a valid json value, even though it is valid in javascript. From rfc4627 (application/json):

A JSON value MUST be an object, array, number, or string, or one of the following three literal names:

false null true

(no mention of undefined)

However this is fairly straight-forward to do with null instead of undefined. In the scala console, first a couple imports:

scala> import org.json4s._
scala> import org.json4s.native.Serialization.write

A customer serializer:

scala> class NoneJNullSerializer extends CustomSerializer[Option[_]](format => ({ case JNull => None }, { case None => JNull }))

And voila:

scala> implicit val formats = DefaultFormats + new NoneJNullSerializer()
scala> val ser = write(List(Some("A"), None, Some("B")))
ser: String = ["A",null,"B"]
Sign up to request clarification or add additional context in comments.

3 Comments

This does not seem to solve the problem when the None is a value in a Map. The entire key seems to be stripped before the implicit conversion is hit.
[edited] Whoops, forgot this was json4s and wrote a comment about spray-json :s
This issue is solved in 3.2.11 version, you coud just use DefaultFormats.preservingEmptyValues. If anyone has issue, refer this stackoverflow.com/questions/27855934/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.