scala에서 json 파싱할 때, 사용할 수 있는 간결한 라이브러리로 ujson이 있다. upickle이 있긴 하지만 아직은 불편하다.
http://www.lihaoyi.com/post/uJsonfastflexibleandintuitiveJSONforScala.html
사용 예시이다.
import ujson.Value
object UjsonSampleMain {
def main(args: Array[String]): Unit = {
val input =
"{\n \"id\": \"c730433b-082c-4984-9d66-855c243266f0\",\n \"price\": 10,\n \"emptyValue\": \"\",\n \"name\": \"Foo\",\n " +
" \"counts\": [1, 2, 3],\n \"values\": {\n \"bar\": true,\n \"baz\": 100.001,\n \"qux\": [\"a\", \"b\"]\n }\n}"
// json을 읽는다
val data: Value.Value = ujson.read(input)
// 'id' 값을 읽는다
println(data("id").isNull)
println(data("id"))
println
// type
println(data("id")) // Value.Value
println(data("id").render()) // String
// 'counts' 값을 읽는다
println(data("counts"))
println
// 'name' 값을 읽은 후 reverse한 값을 기존 json에 저장한다
data("name") = data("name").str.reverse
println(data.render())
println
// json의 Map 데이터는 obj에서 관리된다
println(data.obj)
println
// json 문자열을 Map으로 확인한다.
data.obj.foreach(tuple => println(tuple._1 + ":" + tuple._2))
println
// json의 values 문자열을 Map으로 확인한다.
data.obj("values").obj.foreach { case (k, v) => println(k + ":" + v) }
println
// json의 values.bar의 값을 boolean으로 읽는다.
println(data.obj("values").obj("bar").bool)
println
// 숫자 값
println(data("price").num.intValue())
try {
// 잘못된 json
val wrong = "}" + input + "{"
ujson.read(wrong)
} catch {
case _: Throwable => println("wrong json")
}
}
결과
false
"c730433b-082c-4984-9d66-855c243266f0"
"c730433b-082c-4984-9d66-855c243266f0"
"c730433b-082c-4984-9d66-855c243266f0"
[1,2,3]
{"id":"c730433b-082c-4984-9d66-855c243266f0","price":10,"emptyValue":"","name":"ooF","counts":[1,2,3],"values":{"bar":true,"baz":100.001,"qux":["a","b"]}}
Map(id -> "c730433b-082c-4984-9d66-855c243266f0", price -> 10, emptyValue -> "", name -> "ooF", counts -> [1,2,3], values -> {"bar":true,"baz":100.001,"qux":["a","b"]})
id:"c730433b-082c-4984-9d66-855c243266f0"
price:10
emptyValue:""
name:"ooF"
counts:[1,2,3]
values:{"bar":true,"baz":100.001,"qux":["a","b"]}
bar:true
baz:100.001
qux:["a","b"]
true
10
wrong json