Jaison:专为大模型时代设计的容错 JSON 解析器

在日常开发中,我们越来越依赖大语言模型(LLM)来生成结构化数据,尤其是 JSON 格式的输出。但几乎每个用过 GPT、Claude、Gemini、通义千问、文心一言、深蓝等模型的开发者都遇到过同样头疼的问题:

模型输出的 JSON 经常“看起来很像”,但直接丢给 JSON.parse 就直接炸了。

缺个括号、多了个逗号、用了中文冒号(:)、带了 “`json

Jaison 就是专门为这种场景诞生的纯 JavaScript 容错 JSON 解析器,它能在单次扫描中自动修复几十种 AI 常见的结构性错误,并直接返回可用的 JavaScript 对象。

下面我们一步步来看看它到底能解决哪些实际问题,以及该怎么用。

为什么需要一个专门的容错 JSON 解析器?

标准 JSON.parse 遵循的是 RFC 8259 规范,容错能力几乎为零。任何一点语法错误都会导致整个解析失败。

而大语言模型生成 JSON 时经常出现的情况包括:

  • 响应被截断,只输出一半(流式输出常见)
  • 为了可读性加了 // 注释或 /* */ 注释
  • 使用了中文全角标点:{"name":"张三","age":18}
  • 键没有加双引号:{name: "Lucy", age: 20}
  • 混用单引号和双引号
  • 结尾多余的逗号或缺失的括号
  • 被 “`json 代码块包裹
  • 布尔值、null 没写完:trufalsnul

这些对人来说完全可以理解,但对 JSON.parse 来说就是致命错误。

Jaison 的目标很简单:让 AI 生成的 JSON 真正“能用”

Jaison 能自动修复哪些常见问题?

下面列出它实际支持的修复能力,每一项都附带真实示例:

问题类型 原始文本示例 修复后结果
Markdown 代码块包裹 json\n{"name": "John"}\n {“name”: “John”}
单行 // 注释 {“name”: “John”, // TODO\n “age”: 30} {“name”: “John”, “age”: 30}
多行 /* */ 注释 {“data”: /* temp */ “value”} {“data”: “value”}
单引号字符串 {‘name’: ‘张三’, ‘city’: ‘北京’} {“name”: “张三”, “city”: “北京”}
中文全角标点 {“姓名”:”李四”,”年龄”:25} {“姓名”: “李四”, “年龄”: 25}
键名不带引号 {name: “王五”, age: 30} {“name”: “王五”, “age”: 30}
数字键名 {123: “test”, 456: 789} {“123”: “test”, “456”: 789}
缺失右括号/右中括号 {“list”: [1, 2, 3 {“list”: [1, 2, 3]}
字符串未闭合 {“msg”: “hello world {“msg”: “hello world”}
连续逗号、结尾逗号 [1,,2, , 3,] [1, null, 2, null, 3]
缺失值 {“a”: , “b”: 2} {“a”: null, “b”: 2}
布尔值、null 写一半 {“flag”: tru, “ref”: nul} {“flag”: true, “ref”: null}
其他 null 别名 {“value”: none} 或 {“value”: nil} {“value”: null}
十六进制、八进制、二进制 {“a”: 0xFF, “b”: 0o70, “c”: 0b1010} {“a”: 255, “b”: 56, “c”: 10}
科学计数法 {“big”: 1.23e5, “small”: 4e-2} {“big”: 123000, “small”: 0.04}
JSON 后跟说明文字 {“answer”: 42} 这里是解释文字\n换行也行 {“answer”: 42}
响应被截断(流式常见) {“status”:”thinking”,”result”: {“status”:”thinking”,”result”:null}
大小写不敏感的 true/false/null {“debug”: TRUE, “empty”: NULL} {“debug”: true, “empty”: null}
极深嵌套(20万层也不会栈溢出) {“a”:{“a”:{“a”: …(重复20万次) 正常解析(仅受内存限制)

这些修复几乎覆盖了国内国外所有主流大模型在实际生产环境中出现的 95% 以上的 JSON 问题。

安装与最基础的使用方式

npm install jaison
const jaison = require('jaison');

// 直接拿到解析后的对象(成功时)
const data = jaison('{"name": "张三", "age": 30}');
console.log(data); // { name: '张三', age: 30 }

// 需要处理失败情况时用 try/catch
try {
  const result = jaison(aiGeneratedString);
  // 直接使用 result
} catch (err) {
  console.error('Jaison 也无法修复:', err.message);
}

API 就一个函数,没有复杂配置,越简单越不容易出错。

什么情况下应该用 Jaison,什么情况下仍然用 JSON.parse?

场景 推荐解析器 原因
用户输入、AI 生成、聊天记录等 Jaison 不可控,经常出现各种小错误
国内用户可能输入中文标点 必须用 Jaison 它是目前唯一自动转换中文:,的解析器
流式响应、可能被截断 Jaison 能自动补全缺失的括号和值
已知完全合法、数据量 > 1MB 的内部数据 JSON.parse 速度大约快 6 倍
对性能极度敏感的热点路径 JSON.parse Jaison 在合法 JSON 上会慢一些(仍在毫秒级)
需要处理超深嵌套(上万层) 只能用 Jaison JSON.parse 会直接栈溢出

简单记忆法则:只要数据来源是人或者大模型,先扔给 Jaison

性能实测数据(基于 55 万次测试)

测试场景 JSON.parse 用时 Jaison 用时 倍数关系
小对象(10 个键值对) 17 ms 80 ms 4.7x 慢
大对象(3000 个键) 296 ms 1093 ms 3.7x 慢
大数组(3000 项) 1339 ms 10658 ms 8x 慢
20 万层深度嵌套 栈溢出 95 ms JSON.parse 完全失效
带中文标点、缺括号等 malformed 立即抛错 20-30 ms Jaison 反而更快

结论:在合法 JSON 上 Jaison 确实慢一些,但在 malformed JSON 上它是唯一能用的

常见问题解答(FAQ)

Jaison 能解析文本中间夹着的 JSON 吗?

不能。它要求输入要么是纯 JSON,要么是 “`json 包裹的 JSON。如果前面还有大段文字,需要你先用正则或其它方式提取出来。

它会改变原始数据的语义吗?

极少情况下会。比如连续两个逗号 1,,2 会被补成 [1,null,2],这是最合理的修复方式。绝大部分修复都是“最小干预”原则。

支持 BigInt 吗?

目前跟原生 JSON.parse 一样,把 123n 当作普通字符串处理。如果需要 BigInt,建议解析后再手动转换。

能处理循环引用吗?

不能。JSON 本身就不支持循环引用,Jaison 也不支持。

在浏览器里能直接用吗?

可以,完全是纯 JavaScript,无任何依赖,支持所有现代浏览器和 Node.js。

它安全吗?能防止注入攻击吗?

Jaison 只解析 JSON,不会执行代码。只要你不把解析后的对象直接塞进 eval,应该跟 JSON.parse 一样安全。

HowTo:快速把 Jaison 接入现有项目

// utils/safeJsonParse.js
const jaison = require('jaison');

function safeParse(jsonStr) {
  if (typeof jsonStr !== 'string') return null;
  
  try {
    return jaison(jsonStr);
  } catch (e) {
    console.warn('Jaison 也解析失败', e.message);
    return null;
  }
}

module.exports = safeParse;

然后在所有接收 AI 输出的地方:

const safeParse = require('./utils/safeJsonParse');
const result = safeParse(llmResponse);
if (result) {
  // 放心使用
}

三行代码搞定,再也不用为缺个括号抓狂。

写在最后

Jaison 并不是要取代 JSON.parse,而是成为它在“野外环境”下的完美搭档。

当你面对的是:

  • 国内用户输入的中文标点
  • 各种大模型千奇百怪的输出习惯
  • 实时流式响应可能被截断
  • 需要极高可靠性的生产系统

Jaison 几乎是目前唯一开箱即用的解决方案。

它只有一个函数,却能帮你省下无数个深夜调试“Unexpected token”的时间。

项目地址:https://www.npmjs.com/package/jaison
GitHub:欢迎 star & 提交国内模型特有的 malformed 示例,越多人贡献,修复能力越强。

希望这个小工具能让你的 AI 应用更稳定、更丝滑。祝编码愉快!