使用 type="application/json" 的 script 标签安全嵌入 json 数据,通过 textcontent + json.parse() 获取并做异常处理,配合服务端框架原生支持(如 django json_script),再进行基础类型断言。

直接把 JSON 数据塞进 <script></script> 标签是常见做法,但要真正安全、可靠地使用,关键不在“放”,而在“怎么放”和“怎么取”。核心是让数据可读、可验、不可执行、不污染。
用 type="application/json" 明确声明语义
不要用 <script>var data = {...}</script> 这类可执行脚本形式。正确写法是:
<script id="page-data" type="application/json">
{"title":"新闻详情","author":"李四","published":true}
</script>
这种写法有三重好处:
- 浏览器不会执行其中内容,彻底规避 XSS 和原型污染风险
- 语义清晰,便于工具识别和开发者维护
- 前端可通过标准 DOM API 安全获取,无需字符串解析或正则匹配
前端解析:用 textContent + JSON.parse() 组合
获取后必须做异常防护,不能假设一定成功:
const script = document.getElementById('page-data');
if (!script) throw new Error('Missing data script tag');
const raw = script.textContent.trim();
let data;
try {
data = JSON.parse(raw);
} catch (e) {
console.error('Failed to parse embedded JSON:', e.message, raw);
throw e;
}
// 后续使用 data.title、data.author 等
注意两点:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 用
textContent(不是innerHTML),避免 HTML 解析干扰 - 始终包裹
try/catch,并保留原始字符串用于调试
后端配合:Django 的 json_script 或类似模板机制
如果是服务端渲染页面,推荐用框架原生支持的方案。例如 Django 2.1+ 提供:
{{ my_data|json_script:"initial-data" }}
它会自动生成带 id 和 type="application/json" 的 script 标签,并自动完成 Python → JSON 的安全序列化(处理引号、转义、特殊字符等),无需手动 json.dumps() 拼接。
其他框架也有对应能力:Rails 有 javascript_tag + to_json,Next.js 可用 next/script 配合 dangerouslySetInnerHTML(需谨慎)或更推荐的 getServerSideProps 注入。
进阶防护:校验结构与类型
解析成功只是第一步。建议对关键字段做轻量断言:
- 检查
data是否为对象,排除"null"字符串或数字误解析 - 验证必填字段是否存在且类型正确,如
typeof data.title === 'string' - 对布尔/数字字段做
Number.isFinite()或Boolean()显式转换,避免隐式转换陷阱
不推荐在解析层做复杂 schema 校验(如用 Zod),那属于业务逻辑层职责;但基础类型守门应在解析后立即完成。










