非标准的json数据如何解析,json格式错误怎么解决?
- 云服务器
- 2026-07-20
- 5
什么是非标准 JSON?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,其标准定义在 RFC 7159 和 ECMA-404 中,标准 JSON 严格规定了语法规则,
- 字符串必须使用双引号()
- 对象的键必须是双引号包裹的字符串
- 不允许添加注释
- 数组或对象末尾不能有尾随逗号()
- 数值支持十进制、科学记数法,但不支持NaN、Infinity等
“非标准 JSON”指任何不完全遵循上述规则的 JSON 数据,但通常仍被某些解析器或工具所接受,这类数据在开发过程中经常出现,比如手动编写配置文件、从遗留系统导出的数据,或为了可读性而引入的宽松格式。

常见的非标准 JSON 形式
| 非标准形式 | 示例 | 说明 |
|---|---|---|
| 单引号字符串 | {'name': 'Alice'} | 使用单引号替代双引号包裹字符串和键。 |
| 键不加引号 | {name: "Alice"} | 使用 JavaScript 对象字面量语法,键名不加引号。 |
| 注释 | // 这是注释 或 / 注释 / | 在 JSON 中插入注释,便于说明。 |
| 尾随逗号 | [1, 2, 3,] | 数组或对象最后一项后面多了一个逗号。 |
| 多行字符串 | "line1nline2" 或使用反引号 | 字符串内包含换行符(未转义),或使用反引号模板字符串。 |
| 特殊数值 | NaN, Infinity, -Infinity | 非标准数值表示,标准 JSON 只接受有限数字。 |
| 未转义的控制字符 | 字符串内包含换行(未转义) | 标准 JSON 要求控制字符必须转义,如 n。 |
| 十六进制数字 | 0xFF | 标准 JSON 不支持十六进制字面量。 |
| 重复键 | {"a":1,"a":2} | 标准 JSON 未禁止重复键,但解析器行为不确定,通常被认为非标准。 |
如何解析非标准 JSON
处理非标准 JSON 时,直接使用标准 JSON.parse() 会抛出错误,需要根据具体场景选择合适的方法:
-
使用宽松解析库
许多语言提供了替代的 JSON 解析器,能自动容忍非标准格式:
- JavaScript:JSON5(支持注释、单引号、键不加引号等)、Hjson(Human JSON)
- Python:json 模块的 strict=False 参数(仅对控制字符宽松),或使用 demjson3、json5 库
- 其他:simdjson(高性能,支持部分非标准特性)、jq(支持注释、宽松格式)
-
预处理修正
如果非标准格式类型固定,可先通过正则或字符串替换修正为标准 JSON:
例如去掉注释、将单引号替换为双引号、去掉尾逗号等,但需谨慎,避免误改字符串内容。

-
严格模式 vs 宽松模式
在生产环境中,推荐使用标准 JSON 以保证兼容性,非标准 JSON 仅用于开发、配置或快速原型,不应该在公共 API 中输出。
注意事项
- 安全性:使用宽松解析器时,某些特性(如 eval 风格的解析)可能引入安全风险,尽量避免使用 eval 或 Function 构造器解析 JSON。
- 可移植性:非标准 JSON 在不同系统和语言之间的解析结果可能不一致,导致数据交换错误。
- 性能:宽松解析通常比严格解析慢,且需要处理更多边缘情况。
- 工具链支持:大多数主流 JSON 工具(如 linter、格式化器)默认只接受标准 JSON,非标准格式可能需要额外配置。
相关问题与解答
问题 1:为什么有些配置文件喜欢使用非标准 JSON(如带注释)?

解答:
标准 JSON 不支持注释,但很多配置文件(如 .eslintrc.json、tsconfig.json)需要注释来解释复杂配置项,因此社区衍生出 JSONC(带注释的 JSON)、JSON5、Hjson 等格式,或直接使用 .jsonc 后缀来区分,这些格式在保留 JSON 基本结构的同时,增加了注释、宽松引号等特性,方便人类阅读和维护,但注意,在正式的数据交换中,仍应使用标准 JSON 以确保兼容性。
问题 2:如果收到一份非标准 JSON,我该如何判断它是否“安全”地解析?
解答:
明确数据的来源,若是内部系统或受控环境,可以使用宽松解析器处理,若是外部输入(如 API 响应、用户上传),则 必须 进行严格验证,因为非标准 JSON 可能包含恶意代码或导致解析器行为异常,建议采取以下步骤:
- 尝试使用标准 JSON.parse() 解析,若失败则记录错误并拒绝数据。
- 如果必须支持非标准格式,使用专门的兼容库(如 JSON5)并限制其解析能力(如禁用 eval 相关功能)。
- 对解析后的结果进行类型检查和模式验证,确保数据结构符合预期。