Search code examples
scalascalatrajson4s

Generating Json string using Json4S from a list containing Some and None values


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 ?


Solution

  • 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"]