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

JSON.parse无法解析对象数组字符串及Node.js传参至前端的疑问

问题场景

在Node.js路由中把字符串化的对象数组传给EJS模板,尝试通过隐藏input在前端解析时失败:

路由代码:

let scriptArray = [
  {
    charValue: 'a',
    encodedValueMain: 'g',
  },
  {
    charValue: 'b',
    encodedValueMain: 'o',
  },
]

router.route('/playground')
.get((req, res) =>{
    res.render('playground', {value: JSON.stringify(scriptArray)})
})

EJS模板代码:

<input type="hidden" id="test" value="<%= value %>">

前端JS代码:

(function () {
    let temp = document.getElementById('test');
    let script = JSON.parse(temp);
    console.log(script)
})();

控制台报错:

VM600:1 Uncaught 
SyntaxError: Unexpected token 'o', "[object HTM"... is not valid JSON
    at JSON.parse (<anonymous>)
    at playground.js:5:19
    at playground.js:7:5
(anonymous) @   playground.js:5
(anonymous) @   playground.js:7
解决方法

1. 修复当前隐藏input的解析问题

存在两个关键错误:

  • 错误1:JSON.parse(temp)传入的是DOM元素对象,而非input的value值,需改为JSON.parse(temp.value)
  • 错误2:EJS的<%= %>会转义HTML特殊字符,将JSON中的双引号转为&quot;,破坏JSON格式。需改用<%- %>直接输出原始字符串,不做转义

修改后的EJS代码:

<input type="hidden" id="test" value="<%- value %>">

修改后的前端JS代码:

(function () {
    let temp = document.getElementById('test');
    let script = JSON.parse(temp.value);
    console.log(script)
})();

2. 无需隐藏input的更优方案

直接在EJS模板中将Node.js变量注入前端JS环境,省去隐藏input和JSON解析步骤:

路由代码修改(无需提前JSON.stringify)

let scriptArray = [
  {
    charValue: 'a',
    encodedValueMain: 'g',
  },
  {
    charValue: 'b',
    encodedValueMain: 'o',
  },
]

router.route('/playground')
.get((req, res) =>{
    res.render('playground', {scriptArray}) // 直接传递原数组
})

EJS模板中注入变量

在EJS的<script>标签内用<%- %>输出字符串化后的数组:

<script>
// 前端直接拿到可用的对象数组
const scriptArray = <%- JSON.stringify(scriptArray) %>;
console.log(scriptArray);
</script>

前端可直接使用scriptArray变量,无需额外解析,代码更简洁高效。

内容的提问来源于stack exchange,提问作者Abhay Sahu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:45:04