diff options
7 files changed, 18 insertions, 56 deletions
diff --git a/src/main/scala/cc/spray/json/JsValue.scala b/src/main/scala/cc/spray/json/JsValue.scala index 86d4101..cc1af91 100644 --- a/src/main/scala/cc/spray/json/JsValue.scala +++ b/src/main/scala/cc/spray/json/JsValue.scala @@ -33,45 +33,6 @@ sealed trait JsValue { @deprecated("Superceded by 'convertTo'", "1.1.0") def fromJson[T :JsonReader]: T = convertTo } -object JsValue { - - /** - * General converter to a JsValue. - * Throws an IllegalArgumentException if the given value cannot be converted. - */ - def apply(value: Any): JsValue = value match { - case null => JsNull - case true => JsTrue - case false => JsFalse - case x: JsValue => x - case x: String => JsString(x) - case x: Int => JsNumber(x) - case x: Long => JsNumber(x) - case x: Double => JsNumber(x) - case x: Char => JsString(String.valueOf(x)) - case x: Float => JsNumber(x) - case x: Byte => JsNumber(x) - case x: Short => JsNumber(x) - case x: BigInt => JsNumber(x) - case x: BigDecimal => JsNumber(x) - case x: Symbol => JsString(x.name) - case x: collection.Map[_, _] => JsObject(fromSeq(x)) - case x@ collection.Seq((_, _), _*) => JsObject(fromSeq(x.asInstanceOf[Seq[(_, _)]])) - case x: collection.Seq[_] => JsArray(x.toList.map(JsValue.apply)) - case x => throw new IllegalArgumentException(x.toString + " cannot be converted to a JsValue") - } - - private def fromSeq(seq: Iterable[(_, _)]) = { - val list = ListBuffer.empty[JsField] - seq.foreach { - case (key: String, value) => list += JsField(key, JsValue(value)) - case (key: Symbol, value) => list += JsField(key.name, JsValue(value)) - case (key: JsString, value) => list += JsField(key.value, JsValue(value)) - case (x, _) => throw new IllegalArgumentException(x.toString + " cannot be converted to a JsString") - } - list.toList - } -} /** * A JSON object. @@ -91,9 +52,6 @@ object JsObject { * The members/fields of a JSON object. */ case class JsField(name: String, value: JsValue) extends JsValue -object JsField { - def apply(name: String, value: Any) = new JsField(name, JsValue(value)) -} /** * A JSON array. @@ -108,6 +66,10 @@ object JsArray { */ case class JsString(value: String) extends JsValue +object JsString { + def apply(value: Symbol) = new JsString(value.name) +} + /** * A JSON number. */ diff --git a/src/main/scala/cc/spray/json/JsonParser.scala b/src/main/scala/cc/spray/json/JsonParser.scala index 4a2d64b..b93a9a6 100644 --- a/src/main/scala/cc/spray/json/JsonParser.scala +++ b/src/main/scala/cc/spray/json/JsonParser.scala @@ -40,7 +40,7 @@ object JsonParser extends Parser { JsonString | JsonNumber | JsonObject | JsonArray | JsonTrue | JsonFalse | JsonNull } - def JsonString = rule { JsonStringUnwrapped ~~> JsString } + def JsonString = rule { JsonStringUnwrapped ~~> (JsString(_)) } def JsonStringUnwrapped = rule { "\"" ~ Characters ~ "\" " ~~> (_.toString) } diff --git a/src/test/scala/cc/spray/json/CollectionFormatsSpec.scala b/src/test/scala/cc/spray/json/CollectionFormatsSpec.scala index 009d2e2..f5eafa8 100644 --- a/src/test/scala/cc/spray/json/CollectionFormatsSpec.scala +++ b/src/test/scala/cc/spray/json/CollectionFormatsSpec.scala @@ -29,7 +29,7 @@ class CollectionFormatsSpec extends Specification with DefaultJsonProtocol { "The mapFormat" should { val map = Map("a" -> 1, "b" -> 2, "c" -> 3) - val json = JsObject(JsField("a", 1), JsField("b", 2), JsField("c", 3)) + val json = JsObject(JsField("a", JsNumber(1)), JsField("b", JsNumber(2)), JsField("c", JsNumber(3))) "convert a Map[String, Long] to a JsObject" in { map.toJson mustEqual json } diff --git a/src/test/scala/cc/spray/json/CompactPrinterSpec.scala b/src/test/scala/cc/spray/json/CompactPrinterSpec.scala index 3bc4870..f2d92fc 100644 --- a/src/test/scala/cc/spray/json/CompactPrinterSpec.scala +++ b/src/test/scala/cc/spray/json/CompactPrinterSpec.scala @@ -36,11 +36,11 @@ class CompactPrinterSpec extends Specification { CompactPrinter(JsString("\"\\\b\f\n\r\t\u12AB")) mustEqual """"\"\\\b\f\n\r\t""" + "\\u12ab\"" } "properly print a simple JsObject" in ( - CompactPrinter(JsObject(JsField("key", 42), JsField("key2", "value"))) + CompactPrinter(JsObject(JsField("key", JsNumber(42)), JsField("key2", JsString("value")))) mustEqual """{"key":42,"key2":"value"}""" ) "properly print a simple JsArray" in ( - CompactPrinter(JsArray(JsNull, JsNumber(1.23), JsObject(JsField("key", true)))) + CompactPrinter(JsArray(JsNull, JsNumber(1.23), JsObject(JsField("key", JsBoolean(true))))) mustEqual """[null,1.23,{"key":true}]""" ) "properly print a JSON padding (JSONP) if requested" in { diff --git a/src/test/scala/cc/spray/json/JsonParserSpec.scala b/src/test/scala/cc/spray/json/JsonParserSpec.scala index 0860d05..f030013 100644 --- a/src/test/scala/cc/spray/json/JsonParserSpec.scala +++ b/src/test/scala/cc/spray/json/JsonParserSpec.scala @@ -35,11 +35,11 @@ class JsonParserSpec extends Specification { } "properly parse a simple JsObject" in ( JsonParser(""" { "key" :42, "key2": "value" }""") mustEqual - JsObject(JsField("key", 42), JsField("key2", "value")) + JsObject(JsField("key", JsNumber(42)), JsField("key2", JsString("value"))) ) "properly parse a simple JsArray" in ( JsonParser("""[null, 1.23 ,{"key":true } ] """) mustEqual - JsArray(JsNull, JsNumber(1.23), JsObject(JsField("key", true))) + JsArray(JsNull, JsNumber(1.23), JsObject(JsField("key", JsBoolean(true)))) ) "be reentrant" in { val largeJsonSource = FileUtils.readAllCharsFromResource("test.json") diff --git a/src/test/scala/cc/spray/json/ProductFormatsSpec.scala b/src/test/scala/cc/spray/json/ProductFormatsSpec.scala index 7c643e9..059b931 100644 --- a/src/test/scala/cc/spray/json/ProductFormatsSpec.scala +++ b/src/test/scala/cc/spray/json/ProductFormatsSpec.scala @@ -18,7 +18,7 @@ class ProductFormatsSpec extends Specification { "A JsonFormat created with `jsonFormat`, for a case class with 2 elements," should { import TestProtocol1._ val obj = Test2(42, Some(4.2)) - val json = JsObject(JsField("a", 42), JsField("b", 4.2)) + val json = JsObject(JsField("a", JsNumber(42)), JsField("b", JsNumber(4.2))) "convert to a respective JsObject" in { obj.toJson mustEqual json } @@ -26,20 +26,20 @@ class ProductFormatsSpec extends Specification { json.convertTo[Test2] mustEqual obj } "throw a DeserializationException if the JsObject does not all required members" in ( - JsObject(JsField("b", 4.2)).convertTo[Test2] must + JsObject(JsField("b", JsNumber(4.2))).convertTo[Test2] must throwA(new DeserializationException("Object is missing required member 'a'")) ) "not require the presence of optional fields for deserialization" in { - JsObject(JsField("a", 42)).convertTo[Test2] mustEqual Test2(42, None) + JsObject(JsField("a", JsNumber(42))).convertTo[Test2] mustEqual Test2(42, None) } "not render `None` members during serialization" in { - Test2(42, None).toJson mustEqual JsObject(JsField("a", 42)) + Test2(42, None).toJson mustEqual JsObject(JsField("a", JsNumber(42))) } "ignore additional members during deserialization" in { - JsObject(JsField("a", 42), JsField("b", 4.2), JsField("c", 'no)).convertTo[Test2] mustEqual obj + JsObject(JsField("a", JsNumber(42)), JsField("b", JsNumber(4.2)), JsField("c", JsString('no))).convertTo[Test2] mustEqual obj } "not depend on any specific member order for deserialization" in { - JsObject(JsField("b", 4.2), JsField("a", 42)).convertTo[Test2] mustEqual obj + JsObject(JsField("b", JsNumber(4.2)), JsField("a", JsNumber(42))).convertTo[Test2] mustEqual obj } "throw a DeserializationException if the JsValue is not a JsObject" in ( JsNull.convertTo[Test2] must throwA(new DeserializationException("Object expected")) @@ -49,7 +49,7 @@ class ProductFormatsSpec extends Specification { "A JsonProtocol mixing in NullOptions" should { "render `None` members to `null`" in { import TestProtocol2._ - Test2(42, None).toJson mustEqual JsObject(JsField("a", 42), JsField("b", JsNull)) + Test2(42, None).toJson mustEqual JsObject(JsField("a", JsNumber(42)), JsField("b", JsNull)) } } diff --git a/src/test/scala/cc/spray/json/ReadmeSpec.scala b/src/test/scala/cc/spray/json/ReadmeSpec.scala index 1a30d39..b1c6674 100644 --- a/src/test/scala/cc/spray/json/ReadmeSpec.scala +++ b/src/test/scala/cc/spray/json/ReadmeSpec.scala @@ -10,7 +10,7 @@ class ReadmeSpec extends Specification { val json = """{ "some": "JSON source" }""" val jsonAst = JsonParser(json) - jsonAst mustEqual JsObject(JsField("some", "JSON source")) + jsonAst mustEqual JsObject(JsField("some", JsString("JSON source"))) val json2 = PrettyPrinter(jsonAst) json2 mustEqual |