/
JsonValue.scala
52 lines (40 loc) · 1.34 KB
/
JsonValue.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package net.chrisloy.json
object JsonValue {
val q = "\""
}
sealed trait JsonValue {
def render: String
def / (path: String): JsonValue = JsonUndefined
protected[this] def quot(s: String) = s"${JsonValue.q}$s${JsonValue.q}"
}
case class JsonArray(elems: Seq[JsonValue]) extends JsonValue {
lazy val render = elems map (_.render) mkString ("[", ",", "]")
}
case class JsonObject(fields: Map[String, JsonValue]) extends JsonValue {
lazy val render = fields map {
case (key, value) => s"${quot(key)}:${value.render}"
} mkString ("{", ",", "}")
override def / (path: String) = fields.get(path) getOrElse JsonUndefined
}
case class JsonString(value: String) extends JsonValue {
lazy val render = quot(value)
}
case class JsonNumber(value: Double) extends JsonValue {
lazy val render = new java.text.DecimalFormat("#.######################").format(value)
}
object JsonBoolean {
def apply(value: Boolean) = if (value) JsonTrue else JsonFalse
}
sealed abstract class JsonBoolean(value: Boolean) extends JsonValue
case object JsonFalse extends JsonBoolean(false) {
val render = "false"
}
case object JsonTrue extends JsonBoolean(true) {
val render = "true"
}
case object JsonNull extends JsonValue {
val render = "null"
}
case object JsonUndefined extends JsonValue {
def render = throw new Exception("Cannot render undefined values!")
}