JS 对象转 JSON:从代码里抠出对象变成合法 JSON 的实战做法
把控制台打印或代码里复制出来的 JS 对象字面量转成严格 JSON:给无引号 key 补双引号、单引号转双引号、去掉尾随逗号和注释,调试配置和 Mock 数据都用得上。
JS 对象转 JSON:从代码里抠出对象变成合法 JSON 的实战做法
写前端的人多半都干过这件事:在 DevTools 里展开一个对象,右键复制,粘到测试夹具或者接口文档里,结果 JSON.parse 一上来就抛错。看着像 JSON,其实是 JS 对象字面量,两者长得像,规则却不一样。这篇我把这个差别讲清楚,再说说怎么三步把对象字面量改成能被 JSON.parse 接受的标准 JSON。
JS 对象和 JSON 到底差在哪
JSON 是一套很窄的语法。key 必须用双引号,字符串只能用双引号,不允许注释,最后一项后面不能留尾随逗号,NaN 和 Infinity 也不合法。而 JS 对象字面量宽松得多:key 可以裸写不带引号,字符串单引号双引号都行,// 行注释和 /* */ 块注释随便加,尾随逗号还能让 git diff 更干净。
正因为宽松,从控制台、从 .js 文件、从 JSON5 配置里复制出来的对象,几乎一定违反 JSON 的某条规则。JSON.parse 碰到第一个违规字符就停下报错,而且报错信息往往只甩你一个位置数字,看不出哪儿错。所以中间需要一道宽松的前置处理,把松散语法转成严格 JSON。这正是 JS 对象转 JSON 这个工具在做的事。
三件最常见的脏活:加引号、换引号、去尾逗号
转换说白了就是把三类不合规的写法逐一改掉。
第一是给无引号的 key 补双引号。JSON 的 key 必须是双引号字符串,而对象字面量里 {name: 'Ada'} 的 name 是裸标识符。工具逐个属性扫描,识别出字母、数字、下划线或美元符号组成的标识符 key,给它包上一对双引号,变成 "name"。几十个 key 也不用一个个手敲。
第二是把单引号转成双引号。{greeting: 'hello'} 里值和 key 用的都是单引号,JSON 只认双引号,所以两边都得改写成 "hello"。这里有个坑:单引号里写的 it's ok 带着撇号,转换时要保住这个撇号;文本里原本就有的双引号要转义,否则结果反而解析不了。
第三是删掉尾随逗号。[1, 2, 3,] 或者 {a: 1, b: 2,} 末尾那个逗号在现代 JS 里完全合法,在 JSON 里却非法。删掉它,你既能在源码里留着方便提交的逗号,又能拿到接口和配置文件想要的严格 JSON。
一个真实的输入输出例子
光说规则不直观,看一段实际转换。下面是我从控制台复制出来的对象,带裸 key、单引号、块注释和尾随逗号:
{
user: 'lilei', // 当前登录用户
roles: ['admin', 'dev',],
/* 配额信息 */
quota: { daily: 500, used: 12, },
}
转换之后得到的是标准 JSON,key 都加了双引号,单引号换成了双引号,两处注释清掉,两个尾随逗号也删了:
{
"user": "lilei",
"roles": ["admin", "dev"],
"quota": { "daily": 500, "used": 12 }
}
落在字符串值里的逗号、冒号或者注释符号不会被动。比如某个值写的是 http://a.com,里面那个双斜杠是真正的文本不是代码注释,会原样保留。
调试、配置、Mock 数据里都用得上
我自己最常用到它的是写测试夹具。在 DevTools 里把一个接口返回的对象 Copy object 下来,粘进 fixture 文件,本来想存成 .json,但复制出来的就是 JS 对象格式,直接存解析不了。转一道,严格 JSON 立刻能用,省去手动给每个 key 补引号。
另外两个场景也很高频。一是 JSON5 配置迁移:原来吃 JSON5 的构建工具改成只认严格 JSON,配置里全是解释每项设置的注释加尾随逗号,整个文件粘进来一遍清干净,带注释的原始版本仍旧留在仓库里。二是抠文档里的请求体:接口文档常把请求体写成带裸 key、带行内注释的 JS 对象,复制过来转一下,就得到能直接粘进 Postman 或 curl 的 payload,不用盯着片段把省掉的引号一个个补回去。
有一点要提醒:NaN 和 Infinity 在 JSON5 里允许,严格 JSON 不允许,转换时会被写成 null。如果某个数真的重要,转换前先换成真实值,别让一个悄无声息的 null 混进去。
安全:为什么不用 eval
把不可信文本丢进 eval 或 new Function 是最省事也最危险的解析方式,里面藏的任何代码都会被执行。同事发来一段「JSON」其实是 JS 对象,你为了看一眼就去 eval 一段陌生代码,风险完全没必要。靠谱的做法是用手写的分词器加递归下降解析器,只产出纯数据,粘进来的对象永远跑不了代码、连不上网络,也碰不到页面以外的东西。全程在浏览器标签页里完成,输入不离开页面。
转出干净的 JSON 之后,如果还想进一步处理,可以接着用 JSON 格式化工具 做缩进美化和折叠查看。需要压成一行减小体积,或者要把数据导成表格,Toolora 里也都有对应工具可以串起来用。
把对象字面量改成合法 JSON 这件小事,看着简单,手改起来容易漏引号、漏逗号。交给工具一遍过,调试和配置的节奏会顺很多。
Made by Toolora · Updated 2026-06-13