summaryrefslogtreecommitdiff
path: root/src/main/scala/cc/spray/json/ProductFormats.scala
diff options
context:
space:
mode:
authorMathias <mathias@spray.cc>2011-12-06 13:22:37 +0100
committerMathias <mathias@spray.cc>2011-12-06 13:23:02 +0100
commit94b1fba92d40568c642a0b86c719c4bcc0865b54 (patch)
tree0c9a278e636426f99435b7e4f155cc2fe03495ff /src/main/scala/cc/spray/json/ProductFormats.scala
parent701be7bcf0a295c3de272a11e7cfb477db7ed026 (diff)
downloadspray-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.scala28
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