javascript 中不能 import json,因为 json 是全局内置对象而非 es 模块;正确用法是直接调用 json.parse() 和 json.stringify();node.js 中可导入 .json 文件,但这是解析其内容为 js 值,并非引入 json 对象本身。

JavaScript 中没有原生的 JSON 模块可供直接导入,JSON 是一个全局内置对象,不是 ES 模块,因此不能用 import 语法从外部模块引入。
为什么不能 import JSON?
JSON 是 ECMAScript 规范定义的全局对象,与 Math、Date 类似,开箱即用。它不属于任何第三方包,也不以模块形式发布——所以以下写法是错误的:
-
import JSON from 'json';(不存在该模块) -
import { parse } from 'json';(语法合法但运行时报错:模块未找到) -
import * as JSON from 'json';(同上)
正确用法始终是直接调用:JSON.parse() 和 JSON.stringify()。
Node.js 中的常见混淆点
在 Node.js 环境中,有人误以为可以导入 json 文件作为模块。实际上,ESM 下支持直接导入 .json 文件(需启用 "type": "module" 和 --experimental-json-modules 或 Node.js 17.1+),但这是导入**JSON 文件内容**,不是导入 JSON 对象本身:
-
import config from './config.json';→ 导入的是解析后的 JS 值(如对象),底层由运行时自动调用JSON.parse - 这个过程不暴露
JSON构造器或方法,也无法控制解析行为
安全注意事项:parse 时必须校验输入
JSON.parse() 本身不校验数据来源,若传入不可信字符串(如用户输入、网络响应),可能引发问题:
-
语法错误崩溃:非法 JSON(如尾部逗号、单引号、undefined)会抛出
SyntaxError -
原型污染风险:虽然标准
JSON.parse不触发 setter 或执行代码,但若后续用Object.assign({}, userInput)或不安全的深合并库处理结果,可能被恶意键名(如"__proto__")利用 - 超大/深度嵌套拒绝服务:极端结构可能耗尽内存或栈空间(尤其在服务端)
建议做法:
- 始终用
try...catch包裹JSON.parse() - 对关键字段做类型和结构校验(可用
zod、yup或手动检查) - 服务端解析前可限制字符串长度(如 ≤ 1MB)和嵌套层级(如 ≤ 10 层)
替代方案:需要“安全 JSON”时怎么办?
如果项目要求更健壮的解析能力,可封装或选用轻量库:
- 自定义安全解析函数(带长度/深度限制 + try/catch)
- 使用
safe-json-parse(仅处理 SyntaxError) - 用
fast-json-parse返回 { err, val } 结构,避免异常开销 - 配合 schema 验证(如
zod)实现类型安全解构:ConfigSchema.parse(JSON.parse(str))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











