summaryrefslogtreecommitdiff
path: root/src/main/scala/cc/spray/json/AdditionalFormats.scala
diff options
context:
space:
mode:
authorMathias <mathias@spray.cc>2011-05-24 23:02:25 +0200
committerMathias <mathias@spray.cc>2011-05-24 23:02:25 +0200
commit57bc594e1daa7dff6013759d6fc65f183118aa33 (patch)
treef8ad4c437284fb0583a556a98aba74126a988ea3 /src/main/scala/cc/spray/json/AdditionalFormats.scala
parent854700927ca944d684c9e0758b5a52da4dde2609 (diff)
downloadspray-json-57bc594e1daa7dff6013759d6fc65f183118aa33.tar.gz
spray-json-57bc594e1daa7dff6013759d6fc65f183118aa33.tar.bz2
spray-json-57bc594e1daa7dff6013759d6fc65f183118aa33.zip
Add JsonFormat for JsValues, some more helpers
Diffstat (limited to 'src/main/scala/cc/spray/json/AdditionalFormats.scala')
-rw-r--r--src/main/scala/cc/spray/json/AdditionalFormats.scala62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/main/scala/cc/spray/json/AdditionalFormats.scala b/src/main/scala/cc/spray/json/AdditionalFormats.scala
new file mode 100644
index 0000000..62a30e7
--- /dev/null
+++ b/src/main/scala/cc/spray/json/AdditionalFormats.scala
@@ -0,0 +1,62 @@
+/*
+ * Original implementation (C) 2009-2011 Debasish Ghosh
+ * Adapted and extended in 2011 by Mathias Doenitz
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cc.spray.json
+
+/**
+ * Provides additional JsonFormats and helpers
+ */
+trait AdditionalFormats {
+
+ implicit object JsValueFormat extends JsonFormat[JsValue] {
+ def write(value: JsValue) = value
+ def read(value: JsValue) = value
+ }
+
+ def formatFromWriter[T :JsonWriter] = new JsonFormat[T] {
+ def write(obj: T) = obj.toJson
+ def read(value: JsValue) = throw new RuntimeException("JsonFormat constructed from JsonWriter can't read from JSON")
+ }
+
+ def formatFromReader[T :JsonReader] = new JsonFormat[T] {
+ def write(obj: T) = throw new RuntimeException("JsonFormat constructed from JsonReader can't write JSON")
+ def read(value: JsValue) = value.fromJson[T]
+ }
+
+ /**
+ * Lazy wrapper around serialization. Useful when you want to serialize (mutually) recursive structures.
+ */
+ def lazyFormat[T](format: => JsonFormat[T]) = new JsonFormat[T]{
+ lazy val delegate = format;
+ def write(x: T) = delegate.write(x);
+ def read(value: JsValue) = delegate.read(value);
+ }
+
+ /**
+ * Wraps an existing JsonReader with Exception protection.
+ */
+ def safeReader[A :JsonReader] = new JsonReader[Either[Exception, A]] {
+ def read(json: JsValue) = {
+ try {
+ Right(json.fromJson)
+ } catch {
+ case e: Exception => Left(e)
+ }
+ }
+ }
+
+} \ No newline at end of file