该库构建于Jerkson之上,它是一个Scala包装者,基于一个超快的基于Java的JSON库,Jackson.html
这种方式的好处是,Java和Scala能够共享一样的库(Jackson),而Scala用户能够享受额外类型安全的好处。val json: JsValue = Json.parse(jsonString)
val json = Json.parse(jsonString) val maybeName = (json \ "user" \ name).asOpt[String] val emails = (json \ "user" \\ "emails").map(_.as[String])
generate any Scala value to Json. For example letʼs create a simple Json object: json
只要你有一个type class 你就能將Scala类型转成Json,很容易將任何的Scala值转成Json.例如让咱们建立一个简单的Json对象: api
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格式支持的对象,对吧?)
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("bob@gmail.com") ) ), toJson( Map( "name" -> toJson("Kiki"), "age" -> toJson(25), "email" -> JsNull ) ) ) ) )
val jsonObject = Json.toJson( Map( "users" -> Seq( toJson( Map( "name" -> toJson("Bob"), "age" -> toJson(31), "email" -> toJson("bob@gmail.com") ) ), toJson( Map( "name" -> toJson("Kiki"), "age" -> toJson(25), "email" -> JsNull ) ) ) ) )
val jsonString: String = Json.stringify(jsValue)
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" ) ) )
def sayHello = Action { request => request.body.asJson.map { json => (json \ "name").asOpt[String].map { name => Ok("Hello " + name) }.getOrElse { BadRequest("Missing parameter [name]") } }.getOrElse { BadRequest("Expecting Json data") } }
def sayHello = Action(parse.json) { request => (request.body \ "name").asOpt[String].map { name => Ok("Hello " + name) }.getOrElse { BadRequest("Missing parameter [name]") } }
curl --header "Content-type: application/json" --request POST --data '{"name": "Guillaume"}' http://localhost:9000/sayHello
HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 Content-Length: 15 Hello Guillaume
def sayHello = Action(parse.json) { request => (request.body \ "name").asOpt[String].map { name => Ok(toJson( Map("status" -> "OK", "message" -> ("Hello " + name)) )) }.getOrElse { BadRequest(toJson( Map("status" -> "KO", "message" -> "Missing parameter [name]") )) } }
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 43 {"status":"OK","message":"Hello Guillaume"}