在JsonBuilder中关闭UTF转义

在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

我试图在GroovyServlet(扩展HttpServlet)中使用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: 'Москва'])
  }
输出是

{"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
不同。这是完全相同的东西,只是有不同的表示…@shabunc
assert'\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('Москва'))