在JsonBuilder中关闭UTF转义
我试图在GroovyServlet(扩展HttpServlet)中使用JsonBuilder 以下是一个片段:在JsonBuilder中关闭UTF转义,json,servlets,groovy,Json,Servlets,Groovy,我试图在GroovyServlet(扩展HttpServlet)中使用JsonBuilder 以下是一个片段: public void doGet(HttpServletRequest request, HttpServletResponse response) { response.setContentType('text/plain') response.setCharacterEncoding('utf-8') def pw = response.getW
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: 'Москва'])
}
输出是
{"city":"\u041C\u043E\u0441\u043A\u0432\u0430"}
{сity=Москва}
我只是对JsonBuilder中的UTF逃逸一无所知,谷歌也没有给我任何有价值的东西。所以我想我被卡住了
有人知道如何以与常规groovy对象相同的形式获得json的输出吗?就JavaScript和/或json而言,它是完全相同的输出 您可以轻松地: 您看到的是,它由ECMAScript规范(JavaScript)定义,并且也允许使用 也就是说,我不会太担心,但是如果您坚持禁用字符串转义,您可以使用
JsonOutput
对象:
JsonOutput.prettyPrint(json.toString());
我找到了,我找到了。 因此,如果您像我一样固执,不想认识到(在非常广泛的应用程序中)转义序列与非转义序列完全相同,那么您可以使用
JsonOuput
object,它位于同一标准包groovy.xml中。*:
JsonOutput.prettyPrint(json.toString())
如果有人的答案更详细,我会删除我自己的答案,并将另一个答案标记为已接受。所以我鼓励你)我遇到了同样的问题,而上面的方法不起作用。 然而,这确实:
Sharon,嗯,第一个字符串被转义而第二个字符串没有转义,这与输出不完全相同,这正是这个问题所涉及的内容。)@shabunc我知道-我只是指出,就JS/JSON而言,没有任何区别;你不应该太担心它。@shabunc但是如果你做了
new-JsonSlurper().parseText(new-JsonBuilder(['city':'Мöаа]).toString())
(转换成转义JSON,然后将这个JSON加载回Groovy),你会得到预期的['city':'МöСааa']
。这是一样的…@shabunc不应该是。。。您认为0x0A
与10
不同。这是完全相同的东西,只是有不同的表示…@shabuncassert'\u041c\u043e\u0441\u043a\u0432\u0430'.length()==6
这是相同的6个字符。另外:assert'\u041c\u043e\u0441\u043a\u0432\u0430'.getBytes('UTF-8')=='МССа“”。getBytes('UTF-8')
passs。这两种表示法都有相同的12个字节[-48,-100,-48,-66,-47,-127,-48,-70,-48,-78,-48,-80]
我已经把这个答案合并到我的答案中了。我想我的答案总结了整个线程,现在:)我应该在这里提到,去除json可能会导致XSS漏洞,例如,当malefactor发送{“foo”:“alert(\'XSS\')”}
值包含双引号时,不能使用此方法:println groovy.json.StringEscapeUtils.unescapeJavaScript(JsonOutput.toJson([键:”“aaa”'&中文111”“”])
输出{“键”:“aaa”&中文111“}
这不是一个有效的json,因为中间的双引号。由于@btpka3的问题而被否决了(对某些人来说可能没问题,但应该在回答中指出限制)
JsonOutput.prettyPrint(json.toString());
StringEscapeUtils.unescapeJavaScript(JsonOutput.toJson('Москва'))