工具返回日期、Decimal 和 Path 对象,怎样变成含义明确的 JSON
工具函数返回 Python 对象,不等于已经得到可传给模型的 JSON。日期、小数和 Path 都需要明确对外表示。直接使用 default=str 虽然容易序列化,却会把不同类型压成无法解释的字符串,还可能把未知对象的内部展示泄漏出去。
先约定三种表示
本文日期采用带类型标签的 ISO 日期文本;Decimal 采用原十进制字符串,保留小数位;Path 仅作为路径文本,不读取文件。编码器接受 PurePath,包括原生 Path、PureWindowsPath 和 PurePosixPath,使用 as_posix 按对象既有风格转文本:Windows 分隔符显示为斜杠并保留盘符,POSIX 名字里的字面反斜杠保持原样;这不是路径授权或跨平台路径转换。对带时间的对象另作合同,要求明确时区,不能把一个没有时区的 datetime 自动解释成本地时间。示例用的是纯日期,所以不涉及时间戳转换。
类型标签放在受控信封中,如 kind 与 value,业务数据不能任意伪装成特殊编码对象。若需要反向解码,应限制允许标签并校验结构。本文验证的是编码和参考字段含义,不宣称一个通用反序列化器能安全恢复任意 Python 对象。
白名单比兜底字符串化清楚
编码器先允许 JSON 原生类型,再显式处理 date、Decimal 与 Path。未知对象直接报错,集合也拒绝,不依赖其不稳定迭代顺序。Decimal 必须有限;NaN 或 Infinity 不能因为转成字符串就绕过数值合同。日期与 datetime 的类型关系要注意,较具体的类型应先判断,避免带时间对象被误当纯日期。
附件正常样本应稳定生成三种带标签对象,并在 JSON 往返后保持结构。未知类和集合两个反例必须失败。检查器还确认路径只是文本,没有创建目录或打开目标,也没有把小数先转成二进制浮点再写出。
序列化成功还不等于业务完整
一个 "12.30" 表示十进制数,却没有自动说明币种;一个日期也没有自动说明它是签署日还是交付日。这些含义必须由字段名和上层合同给出,不能寄望类型标签解决全部业务问题。本文不重复金额计算,而是检查跨语言边界有没有丢失类型语义。
失败反例是所有未知对象都调用 str。对象的字符串实现可以改变,也可能含内存地址或内部路径;两个不同类恰好输出相同文字时,后续根本无法辨认。白名单拒绝会让新增类型在开发阶段显式暴露,迫使维护者做一次可审查的编码决定。
OpenAI 函数调用资料允许工具结果以适当内容回传,本文编码信封属于应用选择,不是官方内建的日期或 Decimal 格式。真正回填时仍需使用对应调用的 call_id,并遵守接口结构。离线样本只验证 Python 到 JSON 的含义保存,没有执行模型调用,也不能证明其他语言自动理解这些标签。
配套文件与依据
本文的合成输入和参考结果可下载独立样本 a026.json,离线检查器 a026.py与样本放在同一目录后运行。检查器不调用模型接口。 使用 Python 3.12 或兼容版本,将上述文件下载到同一目录,执行 python a026.py。
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。