Last active
September 25, 2017 12:25
-
-
Save eggm0n/d8221aafbe6a857dc4045ffc6a36a30e to your computer and use it in GitHub Desktop.
extra validation on play json reads
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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