membership-attribute-service/app/json/package.scala (18 lines of code) (raw):

import org.joda.time.LocalDate import play.api.libs.functional.syntax._ import play.api.libs.json.{OWrites, Writes, _} package object json { // Adapted from http://kailuowang.blogspot.co.uk/2013/11/addremove-fields-to-plays-default-case.html implicit class RichOWrites[A](writes: OWrites[A]) { def addField[T: Writes](fieldName: String, field: A => T): OWrites[A] = (writes ~ (__ \ fieldName).write[T])((a: A) => (a, field(a))) def addNullableField[T: Writes](fieldName: String, field: A => Option[T]): OWrites[A] = (writes ~ (__ \ fieldName).writeNullable[T])((a: A) => (a, field(a))) def removeField(fieldName: String): OWrites[A] = OWrites { a: A => val transformer = (__ \ fieldName).json.prune Json.toJson(a)(writes).validate(transformer).get } } implicit val localDateWrites = new Writes[LocalDate] { override def writes(d: LocalDate) = JsString(d.toString("yyyy-MM-dd")) } }