Skip to content

Instantly share code, notes, and snippets.

@eggm0n
Last active September 25, 2017 12:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eggm0n/d8221aafbe6a857dc4045ffc6a36a30e to your computer and use it in GitHub Desktop.
Save eggm0n/d8221aafbe6a857dc4045ffc6a36a30e to your computer and use it in GitHub Desktop.
extra validation on play json reads
import play.api.libs.json._
import scala.reflect.runtime.universe._
def checkedReads[T](underlyingReads: Reads[T])(implicit typeTag: TypeTag[T]): Reads[T] = new Reads[T] {
def classFields[U: TypeTag]: Set[String] = typeOf[U].members.collect {
case m: MethodSymbol if m.isCaseAccessor => m.name.decodedName.toString
}.toSet
def reads(json: JsValue): JsResult[T] = {
val caseClassFields = classFields[T]
json match {
case JsObject(fields) if (fields.keySet -- caseClassFields).nonEmpty =>
JsError(s"Unexpected fields provided: ${(fields.keySet -- caseClassFields).mkString(", ")}")
case _ => underlyingReads.reads(json)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment