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




Posted by 김용환 '김용환'