在JsonBuilder中关闭UTF转义

sha*_*unc 11 groovy json servlets

我正在尝试在groovy servlet中使用JsonBuilder(扩展HttpServlet)这是一个片段:

 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: '??????'])
  }
Run Code Online (Sandbox Code Playgroud)

输出是

{"city":"\u041C\u043E\u0441\u043A\u0432\u0430"}
{?ity=??????}
Run Code Online (Sandbox Code Playgroud)

我对JsonBuilder中的UTF转义一无所知,谷歌搜索也没有给我任何有价值的东西.所以我想我被卡住了.

有没有人知道如何以与我们获得常规groovy对象的输出完全相同的形式获取json的输出?

Teg*_*egi 18

我遇到了同样的问题,上面的方法没有用.但是这样做了:http: //groovy.codehaus.org/gapi/groovy/json/StringEscapeUtils.html

StringEscapeUtils.unescapeJavaScript(JsonOutput.toJson('??????'))
Run Code Online (Sandbox Code Playgroud)

  • 当值包含双引号时,不能使用此方法:`println groovy.json.StringEscapeUtils.unescapeJavaScript(JsonOutput.toJson([key:"""aaa <>"'&& 111 111"""]))`output` { "key":"aaa <>"'&111"}}`这不是一个有效的json,因为中间双引号. (2认同)

Sha*_*ron 5

就JavaScript和/或JSON而言,它完全相同的输出。

您可以轻松地自己确认以下内容

'??????' == '\u041c\u043e\u0441\u043a\u0432\u0430'; // true
Run Code Online (Sandbox Code Playgroud)

您将看到Unicode字符串转义序列,该序列由ECMAScript规范(JavaScript)定义,并且也允许在JSON中使用。

也就是说,我不会太担心,但是如果您坚持禁用字符串转义符,则可以使用该JsonOutput对象:

JsonOutput.prettyPrint(json.toString());
Run Code Online (Sandbox Code Playgroud)

  • @shabunc但是,如果您执行new JsonSlurper()。parseText(new JsonBuilder(['city':'Москва'])。toString())`(转换为转义的JSON,然后将此Json加载回Groovy),则会得到`['city':'Москва']`符合预期。*是*同一件事... (2认同)