2012-03-21 11 views
9

Sto cercando di utilizzare JsonBuilder in servlet Groovy (che si estende HttpServlet) Ecco un frammento:Spegnere UTF fuga in JsonBuilder

public void doGet(HttpServletRequest request, HttpServletResponse response) { 
    response.setContentType('text/plain') 
    response.setCharacterEncoding('utf-8') 

    def pw = response.getWriter() 
    pw.println(new JsonBuilder(['city': 'Москва'])) 
    pw.println([сity: 'Москва']) 
    } 

L'uscita è

{"city":"\u041C\u043E\u0441\u043A\u0432\u0430"} 
{сity=Москва} 

ho appena don' Non so nulla dell'esecuzione di UTF in JsonBuilder, anche googling non mi ha dato alcun valore. Quindi credo di essere bloccato.

Qualcuno sa come ottenere l'output per JSON esattamente nella stessa forma in cui otteniamo l'output per l'oggetto regolare groovy?

risposta

3

Per quanto riguarda JavaScript e/o JSON, è è lo stesso identico output.

Si può facilmente confirm this yourself:

'Москва' == '\u041c\u043e\u0441\u043a\u0432\u0430'; // true 

Quello che stai vedendo sono Unicode string escape sequences, che sono definiti dalle specifiche ECMAScript (JavaScript) e sono autorizzati a JSON pure.

Detto questo, io non mi preoccuperei troppo, ma se ti ostini a disabilitare i fughe stringa, è possibile utilizzare l'oggetto JsonOutput:

JsonOutput.prettyPrint(json.toString()); 
+1

Sharon, beh, non è esattamente lo stesso output in senso che prima stringa è fuggito mentre il secondo non è, e questo è esattamente ciò che questo domanda circa))) – shabunc

+0

@shabunc Lo so - sto solo sottolineando che per quanto riguarda JS/JSON non c'è alcuna differenza; non dovresti preoccuparti troppo di questo. – Sharon

+0

ha ottenuto il tuo punto. sebbene non sia sicuro che sia sempre innocuo, i dati JSON possono essere utilizzati in molti scenari non associati a EcmaScript. Per esempio, personalmente mi serve questo non per il front-end. – shabunc

-1

ho trovato, ho trovato. Quindi, se sei ostinato come me e non vuoi riconoscere che (in una vasta gamma di applicazioni) la sequenza di escape è esattamente la stessa di non-escape, puoi semplicemente usare l'oggetto JsonOuput, che è nello stesso standard pacchetto, groovy.xml *:.

JsonOutput.prettyPrint(json.toString())

Se la risposta di qualcuno sarà più dettagliata, mi cancellerà la mia risposta personale e segnerà l'altra risposta accettata. Quindi vi incoraggio)))

+0

Ho incorporato questa risposta nella mia. Penso che la mia risposta riepiloghi tutto questo thread, ora :) – Sharon

+0

@Sharon - e sono molto lieto di segnalare che hai accettato la tua risposta;) – shabunc

13

Ho riscontrato lo stesso problema, e i metodi di cui sopra non hanno funzionato. Tuttavia questo fatto: http://groovy.codehaus.org/gapi/groovy/json/StringEscapeUtils.html

StringEscapeUtils.unescapeJavaScript(JsonOutput.toJson('Москва')) 
+0

Dovrei menzionare che il mancato rilascio di JSON può portare alla vulnerabilità XSS, ad es. quando malefactor invia '{" foo ":" "}' – jasp

+0

Questo metodo non può essere utilizzato quando i valori contengono virgolette doppie: 'println groovy.json.StringEscapeUtils.unescapeJavaScript ( JsonOutput. toJson ([tasto: "" "aaa <>" '& 中文 111 "" "]) )' output '{" chiave ":" aaa <> "' & 中文 111"} 'che non è un json valido perché la doppia citazione di mezzo. – btpka3