【问题标题】:spring:escapeBody results in invalid JSONspring:escapeBody 导致 JSON 无效
【发布时间】:2014-08-25 17:39:10
【问题描述】:

我正在尝试转义 JSP 中的字符串以在 AJAX 调用上返回有效的 JSON,但是 spring:escapeBody 标记没有正确转义 JSON 的单引号。有效的 JSON 不应转义单引号。

<%@ page trimDirectiveWhitespaces="true" contentType="json/application"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
{
"status": "success",
"body" : "<spring:escapeBody javaScriptEscape="true"> 
           if you don't have "user" an account
           </spring:escapeBody>"
 }

所以这段代码的计算结果为:

{
"status": "success",
"body" : "if you don\'t have \"user\" an account"
 }

但有效的 JSON 必须是:

{
"status": "success",
"body" : "if you don't have \"user\" an account"
 }

反正我不能用 escapeBody 标签转义单引号吗? 或者我可以使用其他标签吗?也许是一个 JSTL 函数?

【问题讨论】:

  • 这是获取 JSON 响应的一种非常不寻常的方式。为什么不从控制器返回对象并让 Jackson 处理 JSON 写入?
  • 这是对我的实际代码的轻微简化,我实际上是在尝试在 JSON 对象的主体中返回一个现有的标记文件(该标记包含未转义的单引号)。我能否在控制器中正确转义标记文件,然后返回转义的 HTML/Javascript?
  • @Bart 感谢您指出这是获取 JSON 响应的一种不寻常的方式。我想每个人都应该远离spring:escapeBody,看看“Java to JSON 最佳实践”和“java to json 最佳库”,即stackoverflow.com/questions/7539954/…

标签: java json spring jsp


【解决方案1】:

正如 Ryan 在 Sotirios Delimanolis 的(非常好的)cmets 中指出的那样:

所以看起来它只是一个实施选择,现在给我们留下了一个并没有真正一致实施的标准......叹息

不管怎样,这里有一个解决方法可以让你的代码正常工作

<%@ page trimDirectiveWhitespaces="true" contentType="json/application"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%-- 
    [1] Removing the escape of the single quote character: jQuery's Ajax cannot handle it
            stackoverflow.com/questions/25491391/springescapebody-results-in-invalid-json
            stackoverflow.com/questions/2275359/jquery-single-quote-in-json-response
--%>
<c:set var="someJsonData" >
    <spring:escapeBody javaScriptEscape="true"> 
               if you don't have "user" an account
    </spring:escapeBody>
</c:set>    
{
    "status": "success",
    "body" : "${fn:replace(someJsonData, "\\\'","'")}" , <%-- [1] --%>
}

Here is the JSTL fn documentation

说实话,这可能不是最干净/最好的解决方案。但它会发挥作用,直到您找到更好的为止。

【讨论】:

  • So obviously this means that even single quotes characters can be - 不,它取决于实现。请参阅我的评论。
  • 奇怪,这一切都这么不清楚。我们甚至不应该争论这个
【解决方案2】:

Javascript Object Notation specification 声明

任何字符都可以转义。

因此,

{
    "status": "success",
    "body" : "if you don\'t have \"user\" an account"
}

是有效的 JSON。

如果您需要创建真正自定义的文本,您需要自己在控制器处理程序方法或其他组件中生成它。

理想情况下,您应该使用带有表示您的状态/正文 JSON 对象的 POJO 的 @ResponseBody 注释方法。

【讨论】:

  • 这也是我的假设,但是如果您将该 json 粘贴到任何 json 解析器中,它会在转义的单引号上引发错误,您的浏览器也是如此。
  • @Ryan This jsfiddle snippet 工作得很好,使用 Gson、Jackson 和 org.json 解析相同的 JSON 也是如此。我会接受 jsonlint 失败,但这似乎是一个错误。
  • @Ryan 基本上,' 不需要转义,但它可以escapeBody 不是用于此目的的正确工具。使用适当的序列化组件。带有适当 POJO 的 JSON 视图或 @ResponseBody。如果 JSP 需要由其他人导入,请创建自己的标签或生成 JSON 并将其添加到模型中。
  • 你说得对,我想我的问题是 jQuery 对此很挑剔。 stackoverflow.com/questions/2275359/…
  • @SotiriosDelimanolis - 是的,但 May 是按照 RFC 2119: This word, or the adjective "OPTIONAL", mean that an item is truly optional 解释的。因此,带有转义单引号的 JSON 可能是有效的 JSON,但也可能不是,具体取决于实现。
猜你喜欢
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 2018-12-07
  • 1970-01-01
相关资源
最近更新 更多