Documentation

You are viewing the documentation for the 2.0.x release series. The latest stable release series is 2.4.x.

§Play JSON ライブラリ

§概要

JSON を使いたければ、play.api.libs.json にある JSON ライブラリを基にした Play の型クラスを使うことをおすすめします。

このライブラリは、超高速の Java ベースの JSON ライブラリ、Jerkson の Scala ラッパー Jackson の上に構築されています。

このアプローチの利点は、Scala と Java の両方で Play は同じ基礎となるライブラリ (Jackson) を共有することができます。Scala ユーザーは Play の JSON サポートがテーブルにもたらす特上の型安全性を楽しむことができます。

play.api.libs.json パッケージは 7 つの JSON データ型を含みます。

これらは全て一般的な JSON の値である JsValue から継承されます。

§Json 文字列のパース

どのような JSON 文字列でも簡単に JsValue としてパースすることができます:

val json: JsValue = Json.parse(jsonString)

§Json ツリーの探索

JsValue を取得し次第、このツリーを探索することができます。この API は Scala で NodeSeq を使って XML ドキュメントを探索するために提供されているものと似ています:

val json = Json.parse(jsonString)

val maybeName = (json \ "user" \ name).asOpt[String]
val emails = (json \ "user" \\ "emails").map(_.as[String])

注意 \ と \\ を使った探索が失敗することはありません。処理の最後で、値が見つからなかった場合に None を返す asOpt[T] を使って、エラーが発生した場合の処理をしなければいけません。または、値が見つからなかった場合に例外と共に失敗する as[T] を使うことができます。

§Scala から Json への変換

Scala 型を Json に変換することのできる型クラスがあれば、とても簡単に Scala の値から Json を生成することができます。例として、シンプルな Json オブジェクトを作成してみましょう:

val jsonNumber = Json.toJson(4)

または、json 配列を作ってみましょう:

val jsonArray = Json.toJson(Seq(1, 2, 3, 4))

ここでは何の問題もなく Seq[Int] を Json 配列に変換しています。しかし、Seq が異なる種類の値を含む場合、もっと複雑になります:

val jsonArray = Json.toJson(Seq(1, "Bob", 3, 4))

これは、Seq[Any] を Json に変換する方法がないためです。(Any は Json がサポートしていないものを含むことだってありますよね?)

シンプルに解決するには、これを Seq[JsValue] として扱います:

val jsonArray = Json.toJson(Seq(
  toJson(1), toJson("Bob"), toJson(3), toJson(4)
))

もっと複雑な Json オブジェクトを作成する最後の例を見てみましょう:

val jsonObject = Json.toJson(
  Map(
    "users" -> Seq(
      toJson(
        Map(
          "name" -> toJson("Bob"),
          "age" -> toJson(31),
          "email" -> toJson("[email protected]")
        )
      ),
      toJson(
        Map(
          "name" -> toJson("Kiki"),
          "age" -> toJson(25),
          "email" -> JsNull
        )
      )
    )
  )
)

これは以下の Json を生成します:

{
  "users":[
    {
      "name": "Bob",
      "age": 31.0,
      "email": "[email protected]"
    },
    {
      "name": "Kiki",
      "age":  25.0,
      "email": null
    }
  ]
}

§Json シリアライズ

JsValue を、それ自身を表現する Json 文字列にシリアライズするのは簡単です:

val jsonString: String = Json.stringify(jsValue)

§その他のオプション

上記の型クラスに基づいた解決策がお勧めではありますが、もし必要であれば、ユーザがこの他のどのような JSON ライブラリを使うことも止めはしません。

例えば以下は、バンドルされたリフレクションベースの Jerkson ライブラリを使って、素の scala オブジェクトを JSON にマーシャリングして回線越しに送信する小さなスニペットです。

import com.codahale.jerkson.Json._

val json = generate(
  Map( 
    "url"-> "http://nytimes.com",
    "attributes" -> Map(
      "name" -> "nytimes", 
      "country" -> "US",
      "id" -> 25
    ), 
    "links" -> List(
      "http://link1",
      "http://link2"
    )
  )
)

次: JSON リクエストの扱いと提供


このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。