当前位置:首页>python>Python 第12天:JSON,让 Agent 读懂结构化数据

Python 第12天:JSON,让 Agent 读懂结构化数据

  • 2026-09-03 21:23:20
Python 第12天:JSON,让 Agent 读懂结构化数据

昨天,我们用异常处理让程序在失败时给出清楚提示。今天再解决一个关键问题:Agent 怎样准确知道“要调用什么工具、参数是什么”?

答案常常是 JSON。它不是某个 AI 专属格式,而是一种通用的数据表示方式。网页接口、大模型工具调用、配置文件和运行记录,都经常用它传递结构化信息。

今天完成 4 件事

1|看懂 JSON 的基本结构

2|分清 JSON 文本和 Python 字典

3|掌握 loads 与 dumps

4|完成结构化任务 Agent

一、先看懂一段 JSON
task_json = '''
{
  "tool": "add",
  "args": {
    "a": 12,
    "b": 8
  }
}
'''

print(task_json)

JSON 使用“键—值”保存信息。这里的 tool 表示工具名称,args 表示参数集合,a 和 b 是两个具体参数。

这时 task_json 仍然只是字符串,程序不能直接写 task_json["tool"] 来读取工具名。必须先把 JSON 文本解析成 Python 对象。

二、用 json.loads() 把文本变成字典
import json

task_json = '{"tool": "add", "args": {"a": 12, "b": 8}}'
task = json.loads(task_json)

print(type(task))
print(task["tool"])
print(task["args"]["a"])

执行顺序是:

1.import json 导入 Python 标准库中的 JSON 模块;

2.json.loads(task_json) 读取字符串并返回字典;

3.task["tool"] 取出字符串 add;

4.task["args"]["a"] 先进入 args 字典,再取出整数 12。

json 是模块名,不能随意改;loads 是模块提供的函数名,也不能乱改;task_json 和 task 是变量名,可以换成有意义的名字。

JSON 和 Python 字典长得很像,但并不是同一个类型。JSON 是跨系统传输的文本,Python 字典是程序运行时可直接操作的数据。

三、用 json.dumps() 把字典变回 JSON
import json

result = {
    "ok": True,
    "answer": 20,
    "message": "计算完成"
}

result_json = json.dumps(result, ensure_ascii=False, indent=2)
print(result_json)

dumps() 返回字符串。参数 ensure_ascii=False 让中文正常显示,indent=2 负责缩进,让结果更容易阅读。

注意:Python 里的布尔值是 True,转换为 JSON 后会变成小写的 true。这是两种格式各自的固定语法,并不是程序写错了。

可以把方向记成一句话:外部 JSON 用 loads 读进 Python,Python 结果用 dumps 变成 JSON 发出去。

四、完整项目:结构化任务 Agent

新建 day12_json_agent.py,复制下面的完整代码:

import json


def add(a, b):
    return a + b


def multiply(a, b):
    return a * b


def run_agent(task_json):
    try:
        task = json.loads(task_json)
        tool_name = task.get("tool")
        args = task.get("args", {})

        tools = {
            "add": add,
            "multiply": multiply
        }

        tool = tools.get(tool_name)
        if tool is None:
            result = {
                "ok": False,
                "error": f"未知工具:{tool_name}"
            }
        else:
            answer = tool(args["a"], args["b"])
            result = {
                "ok": True,
                "tool": tool_name,
                "answer": answer
            }

    except json.JSONDecodeError:
        result = {
            "ok": False,
            "error": "JSON 格式不正确"
        }
    except KeyError as error:
        result = {
            "ok": False,
            "error": f"缺少参数:{error}"
        }
    except TypeError:
        result = {
            "ok": False,
            "error": "参数类型不正确"
        }

    return json.dumps(result, ensure_ascii=False, indent=2)


task_text = '''
{
  "tool": "multiply",
  "args": {
    "a": 6,
    "b": 7
  }
}
'''

print(run_agent(task_text))

在终端运行:

python day12_json_agent.py

你会看到 answer 为 42。程序真正执行的路线是:JSON 文本 → Python 字典 → 找到 multiply 函数 → 传入 6 和 7 → 把结果重新转换成 JSON。

请分别把 tool 改成 add、search,再删除参数 b。观察程序分别走成功、未知工具和缺少参数三条路线。

五、四类错误要分开看

• JSON 少逗号、使用单引号等格式问题,会在解析时触发 JSONDecodeError;

• 变量名写错,例如写成 tasks 而实际只有 task,会触发 NameError;

• 字典里缺少必须的键,直接用中括号读取时会触发 KeyError;

• JSON 格式正确但工具名称不受支持,程序仍能运行,却属于逻辑问题。

“语法可以运行”和“业务逻辑正确”要分开判断。一个合法 JSON 也可能表达了 Agent 不支持的任务。

六、它和 Agent 有什么关系?

真正的 Agent 通常不会只返回一整段模糊文字。大模型可以给出工具名称和参数,程序把它解析成字典,再调用对应函数;工具结果也可以转成 JSON,交给大模型继续判断。

今天掌握的是一条非常重要的数据链路:模型做决定,JSON 传递决定,Python 执行决定。

今日总结

• JSON 是跨系统传递结构化数据的文本格式;

• json.loads() 把 JSON 字符串解析成 Python 对象;

• json.dumps() 把 Python 对象转换成 JSON 字符串;

• 完整项目已经能根据 JSON 选择工具、执行参数并返回标准结果。

下一篇,我们学习文件读写:让 Agent 的数据在程序关闭后仍然保留下来。

完成练习后,欢迎留言:第 12 天完成。

最新文章

随机文章