Is it possible to make json4s not to throw exception when required field is missing?

expert picture expert · Apr 11, 2013 · Viewed 12.1k times · Source

Is it possible to make json4s not to throw exception when required field is missing ?

When I "extract" object from raw json string it throws exception like this one

org.json4s.package$MappingException: No usable value for pager
No usable value for rpp
Did not find value which can be converted into byte
    at org.json4s.reflect.package$.fail(package.scala:98)
    at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$buildCtorArg(Extraction.scala:388)
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$11.apply(Extraction.scala:396)

Is it possible just to let it be null ?

Answer

flavian picture flavian · Apr 11, 2013

It's quite simple, you have to use Option and its potentials, Some and None.

val json = ("name" -> "joe") ~ ("age" -> Some(35));
val json = ("name" -> "joe") ~ ("age" -> (None: Option[Int]))

Beware though, in the above case a match will be performed for your Option. If it's None, it will be completely removed from the string, so it won't feed back null.

In the same pattern, to parse incomplete JSON, you use a case class with Option.

case class someModel(
    age: Option[Int],
    name: Option[String]
);
val json = ("name" -> "joe") ~ ("age" -> None);
parse(json).extract[someModel];

There is a method which won't throw any exception, and that is extractOpt

parse(json).extractOpt[someModel];

A way to replicate that with the scala API would be to use scala.util.Try:

Try { parse(json).extract[someModel] }.toOption