From 119b6b6d00125c0ea386189fa1d25faa30867fb9 Mon Sep 17 00:00:00 2001 From: Lucas Yang Date: Wed, 1 Aug 2018 16:05:54 +0800 Subject: [PATCH] check num of fields in JSON match num of fields in case class --- .../json/ProductFormatsInstances.scala.template | 4 ++++ src/main/scala/spray/json/ProductFormats.scala | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/boilerplate/spray/json/ProductFormatsInstances.scala.template b/src/main/boilerplate/spray/json/ProductFormatsInstances.scala.template index 401ac83c..49a29a23 100644 --- a/src/main/boilerplate/spray/json/ProductFormatsInstances.scala.template +++ b/src/main/boilerplate/spray/json/ProductFormatsInstances.scala.template @@ -34,6 +34,10 @@ trait ProductFormatsInstances { self: ProductFormats with StandardFormats => JsObject(fields: _*) } def read(value: JsValue) = { + val fields = getJsValueFields(value) + if (fields.size != 1) { + deserializationError("Number of fields in JSON does not equal to target class") + } [#val p1V = fromField[P1](value, fieldName1)# ] construct([#p1V#]) diff --git a/src/main/scala/spray/json/ProductFormats.scala b/src/main/scala/spray/json/ProductFormats.scala index 81a48af7..b7003f7c 100644 --- a/src/main/scala/spray/json/ProductFormats.scala +++ b/src/main/scala/spray/json/ProductFormats.scala @@ -32,7 +32,11 @@ trait ProductFormats extends ProductFormatsInstances { new RootJsonFormat[T] { def write(p: T) = JsObject() def read(value: JsValue) = value match { - case JsObject(_) => construct() + case JsObject(fields) => + if (fields.size > 0) { + throw new DeserializationException(s"Redundant fields: ${fields.keys.mkString(",")}") + } + construct() case _ => throw new DeserializationException("Object expected") } } @@ -65,6 +69,12 @@ trait ProductFormats extends ProductFormatsInstances { case _ => deserializationError("Object expected in field '" + fieldName + "'", fieldNames = fieldName :: Nil) } + protected def getJsValueFields(value: JsValue) = value match { + case JsObject(fields) => fields + case _ => deserializationError("object expected!") + + } + protected def extractFieldNames(tag: ClassTag[_]): Array[String] = { val clazz = tag.runtimeClass try {