跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

JSON与JavaScript有什么关系_如何解析和序列化数据

JSON是独立于JavaScript的语言无关数据格式,仅支持null、boolean、number、string、array、object六种类型,不支持函数、undefined等;JSON.parse()和JSON.stringify()是原生纯数据转换方法,严格遵循双引号、无注释、无尾逗号等语法规则。 JSON 是 JavaScript 的一个子集,但不是 JavaScript 代码 JSON(JavaScript Object Notation)语法源自 JavaScript,但它是独立的、语言无关的数据格式。它只支持
null
、
boolean
、
number
、
string
、
array
和
object
六种类型,不支持函数、
undefined
、
Date
、
RegExp
或循环引用。这意味着:
JSON.parse('{ "x": undefined }')
会直接报错
SyntaxError: Unexpected token u in JSON at position 9
——因为
undefined
不是合法 JSON。
JSON.parse()
和
JSON.stringify()
是唯一标准解析/序列化方法 浏览器 和 Node. js 原生提供这两个函数,不依赖外部库。它们不执行代码、不调用构造函数、不处理原型链,纯数据转换:
JSON.parse()
只接受字符串输入;传入对象会抛
TypeError: JSON.parse requires a string
JSON.stringify()
遇到不可序列化的值(如
function
、
undefined
、
Symbol
)会静默忽略该属性(对象中)或转为
null
(数组中) 第二个参数可传
replacer
函数或数组,用于过滤或修改键值;第三个参数可传缩进空格数(如
2
),仅影响格式,不影响语义 示例:
JSON.stringify({ a: 1, b: undefined, c: () => {} }, null, 2) // 输出: // { // "a": 1 // }
常见解析失败原因:空格、BOM、单引号、尾逗号、注释 JSON 格式严格,以下写法全部非法: 用单引号包裹字符串:
'{"key":"value"}'
→ 必须双引号 末尾多逗号:
{"a":1,}
→ 解析失败 含 UTF-8 BOM(
\uFEFF
)开头的响应体 →
JSON.parse()
报错
Unexpected token
HTTP 响应头未设
Content-Type: application/json
,但后端返回了 HTML 错误页(如 500 页面)→ 实际拿到的是 HTML 字符串,不是 JSON 调试建议:先
console.log(typeof data, data.slice(0, 50))
确认是不是字符串,再检查前几个字符是否为
{
或
[
。 Comet AI 浏览器 下载 Comet AI 浏览器,体验由 Perplexity AI 驱动的革命性上网方式。内置 AI 助手可实时总结网页、跨标签页对比信息、自动执行任务。告别繁琐操作,让 AI 成为你的浏览副驾,大幅提升研究与工作效率。支持 Windows、macOS、Android 和 iOS。 下载 立即学习 “ Java免费学习笔记(深入) ”; 需要自定义行为时,别改
JSON.parse
,用封装函数处理边界 比如后端返回日期字符串
"2024-06-15T12:34:56Z"
,想自动转成
Date
对象;或遇到
null
字段想默认填空字符串。这时不该 monkey patch
JSON.parse
,而应: 用
JSON.parse(str, (key, value) => { ... })
的 reviver 参数做类型修复 对
undefined
字段做 fallback,应在业务层处理,而非试图让
JSON.stringify
输出
undefined
需序列化
Date
、
Map
、
Set
等类型时,必须手动在
replacer
中转换,例如:
JSON.stringify(new Date(), (k, v) => v instanceof Date ? v.toISOString() : v)
真正容易被忽略的是:JSON 规范不定义时间、二进制、大数(
BigInt
)的表示方式,这些都得靠业务协议约定,不能指望解析器自动理解。

相关文章