備忘録 〜プログラミング〜

プログラミングに関する事をつらつらと、、

PlayFrameworkでJsonツリー内へのパスアクセスをする

以下のJSONにアクセスしてみる。

val sample:String = """
 { "parts": {
     "sampleA": "valueA",
     "sampleB": "valueB",
     "sampleC": ["valueA", "valueB"]
    }
  }
"""

まずその前に、play.api.libs.jsonにあるJSONライブラリを使用して、JSON文字列をJsValue型に変換する事が出来る。

val jsValue:JsValue = Json.parse(sample)

JsValue型に変換さえしてしまえば、簡単にJSONツリー内にアクセスが可能になる。

・シンプルな \ パス

 (jsValue \ "parts" \ "sampleA")

再帰的な \\ パス

 (jsValue \ "parts" \\ "sampleC")

JsValueからScala値への変換は、こうする。

val sample:String = (jsValue \ "parts" \ "sampleA").as[String]
val sampleSeq:List[String] = (jsValue \ "parts" \ "sampleC").map(_.as[Seq[String]])

ただし、上記のas[T]を使った方法だと変換出来なかったときにJsResultExceptionが発生するため、asOpt[T]を使用したほうが安全とのこと。
その場合、JsResultExceptionは発生せずにNoneが返るようになる。

val sample:String = (jsValue \ "parts" \ "sampleA").asOpt[String]
val sampleSeq:List[String] = (jsValue \ "parts" \ "sampleC").map(_.asOpt[Seq[String]])

ちなみに、再帰的なパスにアクセスしたときの
(jsValue \\ hoge ).map(_.as[T])
のアンダースコアには、配列の要素が毎回入る。(ワイルドカード

参考URL) http://www.playframework-ja.org/documentation/2.0.8/ScalaJson