Play 框架中的 Json 响应字符编码

Posted

技术标签:

【中文标题】Play 框架中的 Json 响应字符编码【英文标题】:Json response character encoding in Play Framework 【发布时间】:2013-01-14 10:44:13 【问题描述】:

我遇到了问题,需要您的帮助。

我正在使用 Java 中的 Play Framework v1.2.4 用于我的移动应用程序的服务器中工作,但 Json 响应存在问题。

我一直使用视图来编码我的 Json 响应,但我意识到当我使用特殊字符(如 ñ、\n、á、é 等)时会出现问题,并且我的移动应用程序有错误运行。

代码如下:


  "id":$data[0],

  "messages": 
  [
      #list items:data[1], as:'message'
                 
           "text":"$message.text"
      $message_isLast ? '' : ','
#/list
 ] 

我尝试使用 java 方法而不是在 .json 视图中正确解析响应,这没关系。那是代码:

JsonObject jsonOut = new JsonObject(); 
jsonOut.addProperty("id",conversation.id); 
JsonArray jsonArray = new JsonArray();   

for(int i = 0; i < conversation.messages.size; i++)  
    Message message = conversation.messages.get(i);
    JsonObject jsonMessage = new JsonObject();
    jsonMessage.addProperty("text", message.text);
    jsonArray.add(jsonMessage); 


jsonOut.add("messages", jsonArray); 

renderText(jsonOut);

我的问题是我是否可以在视图中做一些事情来将变量正确解析为 json 格式而无需手动操作,因为我有很多必须更改的响应。

【问题讨论】:

【参考方案1】:

使用模板来呈现 JSON 字符串是……不好(无论如何,我应该在这里完成我的答案……)。

JSON 序列化程序通常会处理正确的引号、转义特殊字符、尊重类型、编码字符(如果需要)等...我可以看到您的模板不这样做。

使用模板,您需要自己做所有事情,如果您不完全了解 JSON 规范,您将被判失败。这不仅仅是将$message.text 粘贴到适当的位置......

换句话说:你的第二种方法总是比第一种更好。

【讨论】:

感谢您的回答。我必须重做我的所有申请,但最好知道正确的做法。【参考方案2】:

JSON 的默认编码是 UTF-8。 Java 的默认编码取决于区域设置。

您需要确保运行 Play 的 JVM 也以 Charset.defaultCharset() 的形式运行 UTF-8。

【讨论】:

但是我的服务器已经上传到 Heroku Server。我可以在那里将默认编码设为 UTF-8 吗?怎么样?【参考方案3】:

编译器和编辑器都应将其编码设置为“UTF-8”。 Play 框架和 JSON 已经使​​用 UTF-8。属性文件应该是\u.... 编码的。错误可能出在非 Java 文件中。

【讨论】:

以上是关于Play 框架中的 Json 响应字符编码的主要内容,如果未能解决你的问题,请参考以下文章

仅在内容类型 === JSON 时更改 Java 过滤器中的内容类型或字符编码

Node.js / Express - 如何设置响应字符编码?

JSON 字符编码

System.Text.Json 中的字符编码

javascript中的JSON字符编码与java不同

用 html 数据属性中的字符串编码 JSON