2012-03-21 14 views
9

Estoy intentando utilizar JsonBuilder en servlet maravilloso (que se extiende HttpServlet) Aquí hay un fragmento:Desconectar UTF escapar en 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: 'Москва']) 
    } 

La salida es

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

acabo don' No sé nada sobre escaparse de UTF en JsonBuilder, Google también no me dio nada valioso. Así que supongo que estoy atascado.

¿Alguien sabe cómo obtener la salida para JSON exactamente en la misma forma que obtenemos la salida para un objeto groovy regular?

Respuesta

3

En cuanto a JavaScript y/o JSON, es exactamente la misma salida.

Usted puede fácilmente confirm this yourself:

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

Lo que están viendo son Unicode string escape sequences, que se definen por la especificación de ECMAScript (JavaScript) y se permiten en JSON también.

Dicho esto, yo no me preocuparía demasiado, pero si usted insiste en la desactivación de los escapes de cadena, puede utilizar el objeto JsonOutput:

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

Sharon, bueno, no es exactamente la misma salida en el sentido de que la primera cadena se escapó mientras que el segundo no lo es, y eso es exactamente lo que esta pregunta acerca de))) – shabunc

+0

@shabunc Lo sé, solo señalo que, en lo que respecta a JS/JSON, no hay ninguna diferencia; no deberías preocuparte demasiado por eso. – Sharon

+0

entendió su punto. aunque no estoy seguro de que siempre sea inofensivo, los datos json se pueden utilizar en muchos escenarios no relacionados con EcmaScript. Por ejemplo, personalmente yo necesito esto no para la interfaz. – shabunc

-1

lo he encontrado, he Lo encontré. Así que si eres tan obstinado como yo y no quieres reconocer que (en una gama muy amplia de aplicaciones) la secuencia escapada es exactamente igual a la no-escape, puedes usar el objeto JsonOuput, que está en el mismo estándar paquete, groovy.xml *:.

JsonOutput.prettyPrint(json.toString())

Si la respuesta de alguien será más detallada, voy a borrar mi propia respuesta y marcará la otra respuesta como aceptada. Así que lo animo)))

+0

He incorporado esta respuesta en la mía. Creo que mi respuesta resume todo este hilo, ahora :) – Sharon

+0

@Sharon - y estoy muy contento de marcar que aceptas tu respuesta;) – shabunc

13

Me he encontrado con el mismo problema, y ​​los métodos anteriores no funcionó. Sin embargo, esto lo hicieron: http://groovy.codehaus.org/gapi/groovy/json/StringEscapeUtils.html

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

Debería mencionar aquí que el desajuste de json puede conducir a la vulnerabilidad XSS, p. cuando malhechor envía '{ "foo": ""}' – jasp

+0

Este método no se puede utilizar cuando los valores contiene comillas dobles: 'println groovy.json.StringEscapeUtils.unescapeJavaScript ( JsonOutput. toJson ([key: "" "aaa <>" & 中文 111 "" "]) )' output '{" key ":" aaa <> "& 中文 111"} 'que no es un JSON válido porque la cita doble del medio. – btpka3