2013-11-24 10 views
9

come si può inviare, utilizzando il framework di gioco, una risposta JSON che è abbellita? mi piacerebbe avere una query param pretty, che quando viene fornita, una risposta JSON sarebbe pretty-printed.come rispondere a un bel json usando il framework di gioco?

Consideriamo alcuni esempi di codice:

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) 
    } 
} 

come può la magia può fare? le mie ricerche mi hanno portato a json pretty print che non è stato molto utile per conto proprio, ma ha detto che l'abillità dovrebbe essere integrata nelle versioni future. ed era il gioco 2.1.X di cui si parlava - quindi, credo che sia già presente da qualche parte nella versione 2.2X del gioco.

+0

C'è qualche vantaggio nell'avere un JSON abbellito? Se è solo per il debug, è possibile utilizzare un plug-in del browser come JSONView per Firefox per formattarlo. L'invio di JSON abbellito riduce la larghezza di banda. Il comportamento predefinito di –

+0

è il JSON minorato. solo quando fornisci il flag 'pretty' come parametro di query, otterrai il risultato abbellito. benefici? è leggibile ea volte vorrai vedere una rappresentazione leggibile dai tuoi dati. dare un'occhiata a [elasticsearch] (http://www.elasticsearch.com) per esempio. fanno proprio questo. fornendo una bandiera carina, puoi vedere tutti i tipi di dati sul tuo nodo/cluster. questo è abbastanza utile. –

risposta

16

quadro Play è il supporto abbastanza stampa incorporato:

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

Quindi nel tuo caso, sarebbe sufficiente effettuare le seguenti operazioni:

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

suonerebbe occuparsi di tutto ciò che una risposta JSON dovrebbe avere anche se io uso un 'String' invece di' JsObject'? –

+1

Probabilmente no, ma "tutto" è davvero solo il tipo di contenuto. Ho modificato la mia risposta per mostrare cosa è necessario per imporre altri tipi di contenuti, non è un problema. – Leo

+0

fantastico! Grazie :) –

-2

È possibile utilizzare Gson per stampare una stringa Json, non so su scala; ma ecco un esempio Java, che è possibile convertire in scala e usarlo:

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

questo non mi aiuterà. dal momento che sto restituendo una risposta http, ho bisogno di usare l'oggetto JSON di Play, e il framework di gioco si prenderà cura di tutte le cose fastidiose che non voglio definire la mia auto. come l'header 'content-type', ecc '... e BTW, posso ottenere direttamente il bel json come stringa. non c'è bisogno di strumenti esterni. ma ancora una volta, la stringa non mi farà molto bene: \ –

Problemi correlati