You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EJS传服务端对象到客户端时引号转义致JSON.parse报错如何解决

问题根因

EJS 模板的 <%= %> 输出语法默认会对内容做HTML实体转义,你代码中用<%= JSON.stringify(data) %>输出时,字符串里的双引号"会被自动转义为&#34;,直接破坏JSON格式,导致JSON.parse执行报错。

解决方法

根据你的数据可信程度,二选一即可:

  • 方案1:使用非转义输出语法(适合可信数据场景)
    EJS 提供了不对内容做转义的输出标记<%- %>,直接替换原有转义输出标记即可,同时修正多余的引号语法问题:
<script type='text/javascript'>
  <% if (typeof data !== 'undefined' && data) { %>
    // 无需额外包裹单引号,JSON.stringify输出本身就是合法JS字面量
    const data = <%- JSON.stringify(data) %>;
  <% } %>
</script>

注意:该方法直接输出原始内容,仅适用于data为服务端可控的可信数据场景,若data包含用户提交的未过滤内容,会存在XSS注入风险。

  • 方案2:客户端反转义后解析(适合不可信数据场景)
    如果data包含用户可控的不可信内容,保留<%= %>的转义逻辑做XSS防护,在客户端先解码HTML实体再解析JSON即可:
<script type='text/javascript'>
  <% if (typeof data !== 'undefined' && data) { %>
    const escapedStr = '<%= JSON.stringify(data) %>';
    // 通用HTML实体解码方法
    const decodeEntities = (str) => {
      const dom = document.createElement('textarea');
      dom.innerHTML = str;
      return dom.value;
    };
    const data = JSON.parse(decodeEntities(escapedStr));
  <% } %>
</script>
避坑提示

不要给JSON.stringify的输出结果额外包裹单引号,JSON.stringify序列化后的内容本身就是符合JavaScript语法规则的值,可直接赋值给变量,多余的引号反而会触发语法错误。

内容的提问来源于stack exchange,提问作者Xiang Li

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:57:27