diff options
author | Jakob Odersky <jakob@odersky.com> | 2018-03-07 14:07:25 -0800 |
---|---|---|
committer | Jakob Odersky <jakob@odersky.com> | 2019-06-10 23:22:15 +0200 |
commit | a43a10a12fd5653e6050c652024764416b71ab54 (patch) | |
tree | 19824c4e4eb31f849d51520d57a484e4f4ca0640 /shared/src/main/scala/spray/json/JsValue.scala | |
parent | da8ed26cfed5e958eeb29a3444ff882a46090459 (diff) | |
download | spray-json-a43a10a12fd5653e6050c652024764416b71ab54.tar.gz spray-json-a43a10a12fd5653e6050c652024764416b71ab54.tar.bz2 spray-json-a43a10a12fd5653e6050c652024764416b71ab54.zip |
Add support for ScalaJS and Scala Native
Binary compatibility with previous versions is maintained.
Diffstat (limited to 'shared/src/main/scala/spray/json/JsValue.scala')
-rw-r--r-- | shared/src/main/scala/spray/json/JsValue.scala | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/shared/src/main/scala/spray/json/JsValue.scala b/shared/src/main/scala/spray/json/JsValue.scala new file mode 100644 index 0000000..9ed94da --- /dev/null +++ b/shared/src/main/scala/spray/json/JsValue.scala @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2009-2011 Mathias Doenitz + * Inspired by a similar implementation by Nathan Hamblen + * (https://github.com/dispatch/classic) + * + * 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 spray.json + +import collection.immutable +import scala.collection.immutable.TreeMap + +/** + * The general type of a JSON AST node. + */ +sealed abstract class JsValue { + override def toString = compactPrint + def toString(printer: (JsValue => String)) = printer(this) + def compactPrint = CompactPrinter(this) + def prettyPrint = PrettyPrinter(this) + def sortedPrint = SortedPrinter(this) + def convertTo[T :JsonReader]: T = jsonReader[T].read(this) + + /** + * Returns `this` if this JsValue is a JsObject, otherwise throws a DeserializationException with the given error msg. + */ + def asJsObject(errorMsg: String = "JSON object expected"): JsObject = deserializationError(errorMsg) + + /** + * Returns `this` if this JsValue is a JsObject, otherwise throws a DeserializationException. + */ + def asJsObject: JsObject = asJsObject() + + @deprecated("Superceded by 'convertTo'", "1.1.0") + def fromJson[T :JsonReader]: T = convertTo +} + +/** + * A JSON object. + */ +case class JsObject(fields: Map[String, JsValue]) extends JsValue { + override def asJsObject(errorMsg: String) = this + def getFields(fieldNames: String*): immutable.Seq[JsValue] = fieldNames.toIterator.flatMap(fields.get).toList +} +object JsObject { + val empty = JsObject(TreeMap.empty[String, JsValue]) + def apply(members: JsField*): JsObject = new JsObject(TreeMap(members: _*)) + @deprecated("Use JsObject(JsValue*) instead", "1.3.0") + def apply(members: List[JsField]): JsObject = apply(members: _*) +} + +/** + * A JSON array. + */ +case class JsArray(elements: Vector[JsValue]) extends JsValue { + @deprecated("Use JsArray(Vector[JsValue]) instead", "1.3.0") + def this(elements: List[JsValue]) = this(elements.toVector) +} +object JsArray { + val empty = JsArray(Vector.empty) + def apply(elements: JsValue*) = new JsArray(elements.toVector) + @deprecated("Use JsArray(Vector[JsValue]) instead", "1.3.0") + def apply(elements: List[JsValue]) = new JsArray(elements.toVector) +} + +/** + * A JSON string. + */ +case class JsString(value: String) extends JsValue + +object JsString { + val empty = JsString("") + def apply(value: Symbol) = new JsString(value.name) +} + +/** + * A JSON number. + */ +case class JsNumber(value: BigDecimal) extends JsValue +object JsNumber { + val zero: JsNumber = apply(0) + def apply(n: Int) = new JsNumber(BigDecimal(n)) + def apply(n: Long) = new JsNumber(BigDecimal(n)) + def apply(n: Double) = n match { + case n if n.isNaN => JsNull + case n if n.isInfinity => JsNull + case _ => new JsNumber(BigDecimal(n)) + } + def apply(n: BigInt) = new JsNumber(BigDecimal(n)) + def apply(n: String) = new JsNumber(BigDecimal(n)) + def apply(n: Array[Char]) = new JsNumber(BigDecimal(n)) +} + +/** + * JSON Booleans. + */ +sealed abstract class JsBoolean extends JsValue { + def value: Boolean +} +object JsBoolean { + def apply(x: Boolean): JsBoolean = if (x) JsTrue else JsFalse + def unapply(x: JsBoolean): Option[Boolean] = Some(x.value) +} +case object JsTrue extends JsBoolean { + def value = true +} +case object JsFalse extends JsBoolean { + def value = false +} + +/** + * The representation for JSON null. + */ +case object JsNull extends JsValue |