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

Thymeleaf结合Google Charts与Java Map时的JSON语法错误问题

解决Thymeleaf渲染JavaScript时变量截断与JSON语法错误问题

看起来你碰到了两个关键问题:Thymeleaf渲染data变量时被截断,还有手动拼接的JSON格式不合法导致的语法错误。我来一步步帮你解决:

1. 先修复JSON语法错误

你手动拼接的JSON用了单引号',但JSON标准要求键和字符串值必须使用双引号",这就是浏览器抛出Unexpected token ' in JSON错误的直接原因。别再手动拼接JSON了,这很容易出错,让Thymeleaf帮你生成合法的JSON才是靠谱的做法。

2. 让Thymeleaf正确渲染完整的data变量

Thymeleaf默认对JavaScript的内联处理需要正确的语法标记,否则可能会截断变量或者解析出错。按下面的步骤来:

步骤一:给script标签添加内联属性

确保你的script标签声明了Thymeleaf的JavaScript内联模式:

<script th:inline="javascript">
// 你的JS代码写在这里
</script>

步骤二:用Thymeleaf的JSON序列化工具渲染data

如果后端传递的data是一个Java对象(比如Map、POJO),直接用Thymeleaf内置的#objectMapper工具把它序列化为合法的JSON字符串:

function drawChart() {
    // 直接让Thymeleaf生成完整的cols结构,避免手动拼接
    var cols = /*[[${#objectMapper.writeValueAsString([
        {"id":"","label":"Expense","pattern":"","type":"string"},
        {"id":"","label":"Amount","pattern":"","type":"number"}
    ])}]]*/ [];

    // 正确渲染后端传递的data变量,确保完整不截断
    var expenseData = /*[[${#objectMapper.writeValueAsString(data)}]]*/ {};

    // 生成rows数组
    var rows = Object.keys(expenseData).map(expense => {
        return {
            "c": [
                {"v": expense},
                {"v": expenseData[expense]}
            ]
        };
    });

    // 组合成完整的JSON数据
    var jsonData = {
        "cols": cols,
        "rows": rows
    };

    // 后续绘制图表的代码,比如用google charts的话:
    // var chartData = google.visualization.arrayToDataTable(jsonData);
    // ...
}

步骤三:如果后端已经生成好完整的JSON

如果后端直接构造了完整的jsonData对象,那就更简单了,直接在JS里引用:

var jsonData = /*[[${completeJsonData}]]*/ {};

3. 为什么之前的data变量会被截断?

大概率是因为你没有使用Thymeleaf的内联语法标记,导致模板引擎把JS里的data变量当成了普通文本处理,或者在渲染时因为某些特殊字符(比如换行、引号)提前终止了变量输出。用/*[[${variable}]]*/这种内联语法,Thymeleaf会正确处理变量的转义和完整输出。

最后再提醒一句:永远不要手动拼接JSON字符串,不仅容易犯语法错误,还可能引入XSS风险,让Thymeleaf或者后端的JSON序列化工具来做这件事更安全可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:48:09