diff options
author | Mathias <mathias@spray.cc> | 2011-12-06 13:22:37 +0100 |
---|---|---|
committer | Mathias <mathias@spray.cc> | 2011-12-06 13:23:02 +0100 |
commit | 94b1fba92d40568c642a0b86c719c4bcc0865b54 (patch) | |
tree | 0c9a278e636426f99435b7e4f155cc2fe03495ff /src/main/scala/cc/spray/json/ProductFormats.scala | |
parent | 701be7bcf0a295c3de272a11e7cfb477db7ed026 (diff) | |
download | spray-json-94b1fba92d40568c642a0b86c719c4bcc0865b54.tar.gz spray-json-94b1fba92d40568c642a0b86c719c4bcc0865b54.tar.bz2 spray-json-94b1fba92d40568c642a0b86c719c4bcc0865b54.zip |
Remove JsField, turn JsObject(List[JsField]) into JsObject(Map[String, JsValue])
Diffstat (limited to 'src/main/scala/cc/spray/json/ProductFormats.scala')
-rw-r--r-- | src/main/scala/cc/spray/json/ProductFormats.scala | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/src/main/scala/cc/spray/json/ProductFormats.scala b/src/main/scala/cc/spray/json/ProductFormats.scala index 90c3349..810a6ec 100644 --- a/src/main/scala/cc/spray/json/ProductFormats.scala +++ b/src/main/scala/cc/spray/json/ProductFormats.scala @@ -401,24 +401,24 @@ trait ProductFormats { val value = p.productElement(ix).asInstanceOf[T] writer match { case _: OptionFormat[_] if (value == None) => rest - case _ => JsField(fieldName, writer.write(value)) :: rest + case _ => (fieldName, writer.write(value)) :: rest } } private def fromField[T](value: JsValue, fieldName: String)(implicit reader: JsonReader[T]) = { - @tailrec - def getFrom(fields: List[JsField]): T = { - if (fields.isEmpty) { - if (reader.isInstanceOf[OptionFormat[_]]) None.asInstanceOf[T] - else throw new DeserializationException("Object is missing required member '" + fieldName + "'") - } else if (fields.head.name == fieldName) { - reader.read(fields.head.value) - } else { - getFrom(fields.tail) - } - } value match { - case x: JsObject => getFrom(x.fields) + case x: JsObject => + var fieldFound = false + try { + val fieldValue = x.fields(fieldName) + fieldFound = true + reader.read(fieldValue) + } + catch { + case e: NoSuchElementException if !fieldFound => + if (reader.isInstanceOf[OptionFormat[_]]) None.asInstanceOf[T] + else throw new DeserializationException("Object is missing required member '" + fieldName + "'", e) + } case _ => throw new DeserializationException("Object expected") } } @@ -437,6 +437,6 @@ trait NullOptions extends ProductFormats { override protected def productElement2Field[T](fieldName: String, p: Product, ix: Int, rest: List[JsField]) (implicit writer: JsonWriter[T]) = { val value = p.productElement(ix).asInstanceOf[T] - JsField(fieldName, writer.write(value)) :: rest + (fieldName, writer.write(value)) :: rest } }
\ No newline at end of file |