No Json formatter for Option[String]?

Adding this code so that it is implicit-visible from your PersonFormat will make it work.

implicit def optionFormat[T: Format]: Format[Option[T]] = new Format[Option[T]]{
    override def reads(json: JsValue): JsResult[Option[T]] = json.validateOpt[T]

    override def writes(o: Option[T]): JsValue = o match {
      case Some(t) ⇒ implicitly[Writes[T]].writes(t)
      case None ⇒ JsNull
    }
  }

I think that in play it is assumed that option-valued fields should be treated optional at all, hence the behaviour you observed with formatNullable.


You can use:

(__ \ "first_name").formatNullable[String]