什么是 JSON?
JSON(JavaScript Object Notation)是一种常用的数据交换格式。它使用键值对组织数据,既方便人阅读,也方便程序解析。
{
"name": "John",
"age": 30,
"isStudent": false,
"grades": [90, 85, 88],
"address": {
"city": "New York",
"zipcode": "10001"
}
}
这个例子表示一个人的姓名、年龄、学生状态、成绩和地址。
JSON 的值可以是字符串、数字、布尔值、null、数组或对象。大多数主流编程语言都提供处理 JSON 的工具,所以它经常被用来在系统之间传递数据。
但为什么要让模型输出 JSON?
我们来看一个例子。
老师的烦恼
假如我是一位小学老师。开学第一天,我让班上的小朋友写一段个人介绍,然后想把这些信息录入学生管理系统。
每个小朋友的写法肯定不一样。
我叫张三,今年 9 岁,住在幸福小区。妈妈是老师,爸爸是医生。我喜欢画画和唱歌。
我是小美,8 岁,住在梧桐花园。我最喜欢跳舞。爸爸每天都在抓坏人,妈妈在家照顾我。
我们可以让模型提取姓名、年龄、父母工作、地址和爱好。
对于张三,原文已经明确写出了父母职业。对于小美,“每天抓坏人”并不能可靠证明父亲一定是警察,“在家照顾我”也不能证明母亲的职业就是家庭主妇。
不能因为一种解释听起来合理,就把推断写成事实。
所以,一份更稳妥的结果应该把没有明确提供的字段保留为空:
姓名:小美
年龄:8 岁
父亲工作:未提供
母亲工作:未提供
家庭住址:梧桐花园
爱好:跳舞
这么看好像没问题。
但需要思考的是:假如我们要把这些数据录入学生管理系统,该怎么办?
如果只有两个学生,可以手动录入。
如果有 100 个学生呢?
这个老师怕是要累坏了。
于是,我们写一个程序,批量把模型提取的结果导入系统。
问题来了。上面的结果只是一段多行文本。程序要取姓名,可能会读取第一行;要取年龄,可能会读取第二行。
假如现在新增一个“性别”字段:
姓名:小美
性别:女
年龄:8 岁
父亲工作:未提供
母亲工作:未提供
家庭住址:梧桐花园
爱好:跳舞
原来第二行是年龄,现在变成性别,代码就可能出错。
有同学可能会想:不用第几行,直接找“年龄:”不就行了?
那假如我们还要增加父亲和母亲的年龄呢?
姓名:小美
年龄:8 岁
父亲工作:未提供
父亲年龄:未提供
母亲工作:未提供
母亲年龄:未提供
家庭住址:梧桐花园
爱好:跳舞
字段越来越多,层级也越来越复杂。继续依赖行号和文字截取,程序会越来越难维护。
根本原因是什么?
这段数据没有一个稳定、明确的结构。
用 JSON 表示层级
同样的信息可以写成:
{
"name": "小美",
"age": 8,
"father": {
"job": null,
"age": null
},
"mother": {
"job": null,
"age": null
},
"address": "梧桐花园",
"hobby": ["跳舞"]
}
现在,程序可以直接读取 name、age 或 father.job,不需要猜它们在第几行。
JSON 不是所有任务都必须使用的格式。如果结果只给人阅读,普通文本或 Markdown 往往更自然。只有当结果还要交给程序继续处理时,结构化数据才特别有价值。
怎样要求模型输出 JSON?
请从 <student></student> 中提取学生信息,并只输出一个 JSON 对象。
字段:
- name:字符串或 null
- age:数字或 null
- father_job:字符串或 null
- mother_job:字符串或 null
- address:字符串或 null
- hobby:字符串数组
规则:
- 只提取原文明确提供的信息;
- 不根据描述猜测职业;
- 未提供的单值字段写 null;
- 不要输出 JSON 之外的解释文字。
<student>
{{学生自我介绍}}
</student>
这里最重要的,不只是“返回 JSON”四个字。
我们还说明了字段、类型、缺失值和不能推断的边界。
模型说“这是 JSON”,就一定能用吗?
不一定。
它可能多输出一段解释,漏掉字段,使用错误类型,或者生成语法不合法的 JSON。即使语法正确,内容也可能不符合业务规则。
因此,程序至少还要检查两件事:
- 输出能不能被 JSON parser 解析;
- 字段、类型、允许值和业务规则是否正确。
如果平台支持 Structured Outputs 或 JSON Schema,可以优先使用平台提供的结构约束。但具体支持范围会变化,仍要以所用接口的官方文档为准。
注意: 上面的学生资料全部是虚构示例。不要为了练习,把真实儿童住址、身份证明、健康信息或其他敏感数据提交给模型。
JSON 让结果更容易进入程序,但真正的可靠性来自:字段定义清楚、未知值不乱猜、程序负责校验、例外有人处理。
上一章: 结构化 Prompt 模板与技巧
下一章: 善用 XML 标签