|
|
导语
调用大模型 API、开发 RAG 知识库、对接 Web 接口时,JSON 无处不在。很多开发者天天写 JSON,但是并不完全了解标准语法边界、历史由来、序列化反序列化坑点,尤其在大模型要求结构化 JSON 输出时,经常遇到解析报错、格式崩坏。本文从基础定义、语法结构、诞生历史讲起,对比曾经主流的 XML,梳理 JSON 核心优势、原生支持的数据类型、常见语法陷阱,结合 AI 大模型业务场景给出实战代码与最佳实践。
一、什么是 JSON
通俗类比:JSON 就是软件世界的标准集装箱。不管是 Python、Java、JavaScript,还是数据库、大模型服务,把数据装进这套标准集装箱,各个系统之间就可以无障碍搬运、交换信息。
JSON 全称 JavaScript Object Notation,JavaScript 对象表示法,是一套轻量级、文本型的数据交换格式,并不是编程语言。2001 年由 Douglas Crockford 提出,脱胎于 JavaScript 对象字面量语法,如今已经完全语言无关,几乎所有编程语言都具备解析生成 JSON 的能力JSON中...。
JSON 只有两种基础结构,可以互相无限嵌套组合:
- 对象 Object({}大括号):键‑值对集合。键名必须使用双引号。
- 数组 Array([]中括号):有序元素列表,元素可以是字符串、数字、布尔、对象、数组。
标准 JSON 示例:
- {
- "username": "张三",
- "age": 28,
- "is_vip": true,
- "hobbies": ["阅读","AI编程"],
- "contact": {
- "email": "test@example.com"
- }
- }
复制代码 JSON 原生仅支持 6 种数据类型
- 字符串 string(必须双引号)
- 数字 number(整数、浮点数)
- 布尔 boolean:true / false(小写)
- 对象 object { ... }
- 数组 array [ ... ]
- null 空值
❗注意:标准 JSON不支持注释,没有原生 date 日期类型,没有undefined、函数类型。
二、JSON 的诞生:为什么取代 XML 成为主流
在 AJAX 网页技术普及早期,XML 是系统之间数据交换的标准格式。XML 依靠成对标签描述数据,标签繁琐冗余,传输体积大,解析开销高。
XML 示例:
- <user>
- <username>张三</username>
- <age>28</age>
- <is_vip>true</is_vip>
- </user>
复制代码 JSON 对比 XML 带来的核心优势:
- 高可读性:结构简洁,人眼可以快速读懂数据,调试排错效率高。
- 完全语言无关:虽然名字带 JavaScript,但 Python、Java、Go、C# 都有成熟库,异构系统对接无障碍。
- 体积轻量化,没有大量开闭标签,网络传输字节更少,移动弱网环境表现更好。
- 天然映射编程语言数据结构:JSON 对象 ↔ 字典 / 结构体;JSON 数组 ↔ 列表。序列化(对象转字符串)、反序列化(字符串转回对象)开发成本低。
- 生态极其完备:MySQL、PostgreSQL 支持 JSON 字段;MongoDB 文档数据库基于 JSON 变种;HTTP API、消息队列、配置、日志普遍采用 JSON 格式。
补充:XML 并没有完全消失,在传统政务、SOAP 接口、文档解析领域仍有使用,但互联网 API、大模型接口基本全面转向 JSON。
三、两个核心概念:序列化、反序列化
- 序列化 dumps:内存里面的程序对象 / 字典 → JSON 文本字符串,用于网络请求、存储文件。
- 反序列化 loads:JSON 字符串 → 程序内存对象,接口拿到响应之后解析使用。
Python 简单示例:
- import json
- # Python内存字典
- data = {
- "model": "qwen2.5‑7b",
- "prompt": "解释什么是JSON",
- "temperature": 0.7
- }
- # 序列化:对象 → JSON字符串
- json_str = json.dumps(data, ensure_ascii=False, indent=2)
- print(json_str)
- # 反序列化:JSON字符串 → Python对象
- parse_result = json.loads(json_str)
- print(parse_result["model"])
复制代码 四、高频踩坑:标准 JSON 语法易错点
- // ❌非法,键用单引号
- { 'name': "张三" }
- // ✅合法
- { "name": "张三" }
复制代码- 标准 JSON 不支持//、/* */注释很多编辑器 JSONC 扩展支持注释,但这属于非标准扩展,接口传输会直接解析报错。如果需要备注,可以新增一个"_comment"业务字段来记录说明文字。
- 对象、数组最后一项禁止尾随多余逗号
- // ❌错误,末尾逗号
- {"name":"张三", "age":28, }
- // ✅正确
- {"name":"张三", "age":28}
复制代码
- 没有日期类型,时间统一使用ISO‑8601 字符串"2026‑08‑28T10:30:00Z"或者 Unix 时间戳数字,不要写自定义日期字符串。
- 大整数精度丢失:JavaScript 解析超过2^53的数字会丢失精度;设备序列号、账号长 ID 建议用字符串存储,不要存数字类型CSDN博...。
- 禁止undefined,空值使用null。
五、AI 大模型业务中的 JSON 实战
现在几乎所有 LLM 对外 HTTP 接口请求、返回体全部使用 JSON。同时结构化输出场景,会要求大模型直接输出 JSON 文本。
1、标准大模型 API 请求示例
- {
- "model": "qwen2.5‑7b‑instruct",
- "messages": [
- {"role":"user","content":"请总结下面文档内容"}
- ],
- "temperature":0.1,
- "max_tokens":1024
- }
复制代码
2、大模型结构化输出常见问题
大模型经常在 JSON 前后输出自然语言解释文字,造成json.loads()直接抛解析异常。工程处理方案:
- Prompt 明确约束:只输出 JSON,不要多余解释文字;
- 使用模型原生 JSON‑Mode;
- 代码层面做字符串清洗,截取{}或者[]包裹的片段再反序列化;
- 使用 JSON Schema 校验输出字段合法性。
注意:流式 SSE 返回并不是完整 JSON,是一条条独立 JSON 片段,业务代码需要逐行解析。
六、新手高频认知误区澄清
误区 1 JSON 是 JavaScript 专属格式
纠正:名字来源于 JS 语法,但是完全语言无关,所有主流编程语言都支持 JSON。
误区 2 JSON 可以写 // 注释
纠正:标准 JSON 不支持注释;JSONC/JSON5 是扩展格式,网络接口传输不要使用。
误区 3 写 JSON 可以随便用单引号
纠正:标准 JSON 键和字符串必须双引号,单引号属于部分语言的对象语法,不是合法 JSON。
误区 4 JSON 自带 date 日期数据类型
纠正:没有日期类型,用 ISO‑8601 时间字符串或者时间戳数字。
误区 5 把程序对象直接当成 JSON
纠正:Python 字典、JS 对象不等于 JSON;必须经过 dumps 序列化得到 JSON 字符串。
七、本期全文总结
1 JSON 是轻量级文本数据交换格式,只有对象{}、数组[]两种基础结构,一共 6 种原生数据类型;键名、字符串必须双引号,标准格式不支持注释。2 诞生背景:用来替代笨重的 XML,优势是可读性好、语言无关、体积小、天然映射程序内存数据,生态强大。3 序列化:内存对象转为 JSON 字符串;反序列化:JSON 字符串转回程序对象,二者是网络接口开发最基础操作。4 开发高频坑:禁止注释、禁止末尾逗号、长 ID 用字符串、日期用 ISO‑8601,不使用单引号。5 AI 大模型开发:LLM 接口全部使用 JSON;结构化输出要处理模型额外文本干扰,必要时搭配 JSON Schema 校验。6 JSON 只是数据载体,业务上还需要额外做字段、类型校验,不能拿到字符串就直接反序列化信任使用。
|
|