當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Play 2.0 用户指南 - 使用JSON库 -- 针对Scala开发者
生活随笔
收集整理的這篇文章主要介紹了
Play 2.0 用户指南 - 使用JSON库 -- 针对Scala开发者
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
??? 概述
??? 使用JSON的推薦方式是使用 Play 的基于類的JSON庫,位于play.api.libs.json下.
??? 該庫構建于Jerkson之上,它是一個Scala包裝者,基于一個超快的基于Java的JSON庫,Jackson.
??? 這種方式的好處是,Java和Scala可以共享同樣的庫(Jackson),而Scala用戶可以享受額外類型安全的好處。??? play.api.libs.json包中,包含了7個JSON數據類型:
??? ??? JsObject
??? ??? JsNull
??? ??? JsUndefined
??? ??? JsBoolean
??? ??? JsNumber
??? ??? JsArray
??? ??? JsString
???
??? 它們都繼承自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])
?? 注意使用 \ 遍歷不會導致失敗.你必須在末尾使用 asOpt[T]自行處理出錯誤情形,它將返回 None 如果值缺失的話.否則,你可以使用 as[T],以拋異常的方式處理失敗,如果值丟失的話.
??? Scala值轉成Json
??? As soon as you have a type class able to transform the Scala type to Json, it is pretty easy to
??? generate any Scala value to Json. For example let?s create a simple Json object:
??? 只要你有一個type class 你就能將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("bob@gmail.com"))),toJson(Map("name" -> toJson("Kiki"),"age" -> toJson(25),"email" -> JsNull)))) )
??? 它將產生如下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)))) )
??? Json序列化
??? 將JsValue轉成Json字符串形式很容易:val jsonString: String = Json.stringify(jsValue)
??? 其它選擇
??? 上面討論的基于類型的選擇是推薦的形式,當然也不會限制你使用其它JSON庫。???
??? 例如,下面是一小段演示怎樣將純Scala對象轉成JSON 對象,通過綁定的,基于反射的Jerkson。
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請求
??? 處理Json請求
??????? 一個 JSON 請求是一個使用 request body 搭載經驗證的JSON內容的 HTTP 請求.它必須指定 Content-Type 為text/json或application/json mime類型。
??? 默認Action使用any content body parser,讓你以JSON取值得request body 值(實際上是JsValue):
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")} }
??? 更好的方法是自定義BodyParser,請求Play直接將body解析為JSON:
def sayHello = Action(parse.json) { request =>(request.body \ "name").asOpt[String].map { name =>Ok("Hello " + name)}.getOrElse {BadRequest("Missing parameter [name]")} }
??? 注意:當使用JSON body parser的時候,request.body的值直接做為一個經驗證的JsValue值。
??? 你可以通過在命令行中用curl測試:
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: 15Hello Guillaume
??? 返回JSON響應
??? 前面的一些例子,我們接收JSON請求,但我們返回的是text/plain響應。
??? 讓我們更改為一個有效的HTTP響應:
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"}
轉載于:https://my.oschina.net/dongming/blog/49968
總結
以上是生活随笔為你收集整理的Play 2.0 用户指南 - 使用JSON库 -- 针对Scala开发者的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何关闭Windows7的UAC
- 下一篇: Ext JS 4.1 RC2 Relea