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 {