forked from lichess-org/lila
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPimpedJson.scala
76 lines (55 loc) · 1.82 KB
/
PimpedJson.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package lila.common
import play.api.libs.json._
object PimpedJson extends PimpedJson
trait PimpedJson {
implicit final class LilaPimpedJsObject(js: JsObject) {
def str(key: String): Option[String] =
(js \ key).asOpt[String]
def int(key: String): Option[Int] =
(js \ key).asOpt[Int]
def long(key: String): Option[Long] =
(js \ key).asOpt[Long]
def boolean(key: String): Option[Boolean] =
(js \ key).asOpt[Boolean]
def obj(key: String): Option[JsObject] =
(js \ key).asOpt[JsObject]
def arr(key: String): Option[JsArray] =
(js \ key).asOpt[JsArray]
def arrAs[A](key: String)(as: JsValue => Option[A]): Option[List[A]] =
arr(key) map { _.value.toList map as flatten }
def ints(key: String): Option[List[Int]] = arrAs(key)(_.asOpt[Int])
def get[A: Reads](key: String): Option[A] =
(js \ key).asOpt[A]
def noNull = JsObject {
js.fields collect {
case (key, value) if value != JsNull => key -> value
}
}
}
implicit final class LilaPimpedJsValue(js: JsValue) {
def str(key: String): Option[String] =
js.asOpt[JsObject] flatMap { obj =>
(obj \ key).asOpt[String]
}
def int(key: String): Option[Int] =
js.asOpt[JsObject] flatMap { obj =>
(obj \ key).asOpt[Int]
}
def long(key: String): Option[Long] =
js.asOpt[JsObject] flatMap { obj =>
(obj \ key).asOpt[Long]
}
def boolean(key: String): Option[Boolean] =
js.asOpt[JsObject] flatMap { obj =>
(obj \ key).asOpt[Boolean]
}
def obj(key: String): Option[JsObject] =
js.asOpt[JsObject] flatMap { obj =>
(obj \ key).asOpt[JsObject]
}
def arr(key: String): Option[JsArray] =
js.asOpt[JsObject] flatMap { obj =>
(obj \ key).asOpt[JsArray]
}
}
}