2013-11-24 21 views
9

如何使用play框架發送一個被美化的json響應? 我想有一個查詢參數pretty,即當它的供給,JSON響應將是適合打印如何使用Play框架回復漂亮的json?

考慮一些示例代碼:

def handleGET(path:String) = Action{ implicit request => 
    val json = doSomethingThatReturnsAJson(path,request) 
    request.getQueryString("pretty") match { 
    case Some(_) => //some magic that will beautify the response 
    case None => Ok(json) 
    } 
} 

如何神奇做些什麼呢? 我的搜索引導我到json pretty print 這對它本身並沒有太大的幫助,但它確實說明了應該在未來的版本中集成這些技能。這是被玩過的2.1.X,所以我猜它已經存在於2.2X版本的遊戲中。

+0

美化JSON有什麼好處嗎?如果僅用於調試,則可以使用瀏覽器插件(如JSONView for Firefox)對其進行格式化。發送美化的JSON只會浪費帶寬。 –

+0

默認行爲是縮小的JSON。只有在提供'pretty'標誌作爲查詢參數時,纔會得到美化結果。好處是什麼?它是可讀的。有時你會希望看到你的數據可以被人看懂。以[elasticsearch](http://www.elasticsearch.com)爲例。他們這樣做。通過提供漂亮的標誌,您可以看到節點/集羣上的所有類型的數據。這是非常有用的。 –

回答

16

播放框架已經相當打印支持內置:

import play.api.libs.json.Json 
Json.prettyPrint(aJsValue) 

所以你的情況,這將是足夠的請執行以下操作:

def handleGET(path:String) = Action { implicit request => 
    val json = doSomethingThatReturnsAJson(path, request) 
    request.getQueryString("pretty") match { 
    case Some(_) => Ok(Json.prettyPrint(json)).as(ContentTypes.JSON) 
    case None => Ok(json) 
    } 
} 
+0

會照顧json響應應該具備的所有內容,即使我使用String而不是JsObject? –

+1

可能不是,但「一切」真的只是內容類型。我編輯了我的答案,以顯示執行其他內容類型的必要條件,這不是什麼大問題。 – Leo

+0

太棒了!謝謝 :) –

-2

您可以使用GSON到漂亮打印JSON字符串,不知道斯卡拉;但這裏是一個可以轉換爲Scala和使用它的Java示例:

Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
String jsonStr = gson.toJson(obj); 
System.out.println(jsonStr); 
+0

這不會幫助我。因爲我要返回一個http響應,所以我需要使用play的json對象,並且play框架會照顧到我不想定義我自己的所有煩人的事情。就像'content-type'頭文件等等......順便說一句,我可以直接將字符串轉換成漂亮的json。不需要外部工具。但是再一次,字符串對我不會有太大的好處:\ –