把“看起来像数据”变成程序能用的数据
让 AI 把“今晚学 JSON,预计 20 分钟,还没完成”变成一条学习记录。目标字段是 title、minutes、done。你会先解析,再验证,最后保存中文结果,理解为什么 JSON 格式正确仍可能不能用于业务。
准备 Python 3 和一个空文件 plan_json.py;也可先在任意聊天助手里做提示练习,不用配置本站模型。
先向 AI 要一份明确格式
把这句话转换为JSON对象:今晚学JSON,预计20分钟,还没完成。
只允许title、minutes、done三个字段。
title是非空字符串,minutes是1~180的整数,done是布尔值。
只输出JSON,不加Markdown围栏或解释;没有给出的信息不要猜。
本题期望类似下面的结果:
{"title":"学习 JSON","minutes":20,"done":false}
JSON 中字符串用双引号,false 小写;Python 中对应 False。不要把两种语法混在同一份文本里。Python JSON 转换说明。
第一步解析,第二步验证
下面整段可独立运行,先复制到 plan_json.py,再执行 python plan_json.py:
import json
def parse_plan(raw):
try:
data = json.loads(raw)
except json.JSONDecodeError as exc:
raise ValueError(f"JSON语法错误:第{exc.lineno}行第{exc.colno}列") from exc
if not isinstance(data, dict) or set(data) != {"title", "minutes", "done"}:
raise ValueError("需要且只允许 title、minutes、done")
if not isinstance(data["title"], str) or not data["title"].strip():
raise ValueError("title 不能为空")
if type(data["minutes"]) is not int or not 1 <= data["minutes"] <= 180:
raise ValueError("minutes 必须为1~180整数")
if type(data["done"]) is not bool:
raise ValueError("done 必须为布尔值")
return {**data, "title": data["title"].strip()}
raw = '{"title":"学习 JSON","minutes":20,"done":false}'
plan = parse_plan(raw)
assert plan["minutes"] == 20 and plan["done"] is False
print(json.dumps(plan, ensure_ascii=False, indent=2))
for invalid in ['{"title":"x","minutes":"20","done":false}',
'{"title":"x","minutes":true,"done":false}',
'{"title":"x","minutes":20}']:
try:
parse_plan(invalid)
except ValueError:
pass
else:
raise AssertionError(invalid)
json.loads 把文本变成字典;后面的代码才负责“20 不能是字符串”“完成状态必须是布尔值”等业务约定。ensure_ascii=False 让输出保留可读中文,不是修复错误编码的万能开关。
故意制造三种错误
把 minutes 改成 "20":这是合法 JSON,但类型不符。把 done 删掉:仍是合法 JSON,但字段不完整。把双引号换单引号:这次是语法错误,解析阶段就会失败。
依次运行,观察错误信息不同。这能帮助你以后定位问题:先解决解析失败,再处理数据约定,不要所有错误都提示“模型不可用”。
如何把失败反馈给 AI
若输出把 20 写成字符串,发送:
你的JSON语法可解析,但minutes给成了字符串"20",本题要求整数20。请只修复类型,保留title内容与done=false。仍只输出三个规定字段,不增加说明文字。
如果材料没有给分钟数,应该让助手报告缺失或先询问,而不是编一个 20。结构化格式不能替代真实依据;你可以为实际项目设计允许 null 的字段,但需要同时调整校验约定。
保存文件时怎样避免乱码
实际写文件时使用 UTF-8,读取时也明确同样编码。不要把 JSON 文本再做一次 dumps 后当原对象保存,那会得到带很多转义符的“字符串里的 JSON”。
练习可以先将打印结果复制进 plan.json,用编辑器重新打开,确认中文、数字和 false 都保持。以后让脚本写文件时先写到练习目录的新文件,不覆盖唯一原件。