结构化提取

JSON Schema 写了 date,并不表示校验器一定检查日期

Schema 里写着 `format: date`,坏日期却通过了校验,不一定是库出了 bug。`format` 的处理方式取决于验证器配置。拿到一个“校验成功”,先问它到底检查了类型、结构,还是也检查了日期语义。

阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。 Schema 里写着 format: date ,坏日期却通过了校验,不一定是库出了 bug。 format 的处理方式取决于验证器配置。拿到一个“校验成功”,先问它到底检查了类型、结构,还是也检查了日期语义。 看似相同的两次校验 2026-02-30 是字符串,也长得像日期,但二月没有第三十天。只检查正则外形,会漏掉这类问题。下面用 Python 的 jsonschema 对照默认验证器与显式启用 FormatChecker 的结果。 用一个不可能存在的日期试探配置 from jsonschema import Draft202012Validator, FormatChecker schema = {"type": "string", "format": "date"} structural = Draft202012Validator(schema) strict = Draft202012Validator(schema, format_checker=FormatChecker()) def valid(v, value): return not list(v.iter_errors(value)) assert valid(structural, "2026-02-30") assert not valid(strict, "2026-02-30") assert valid(strict, "2024-02-29") assert not valid(strict, "2025-02-29") assert not valid(strict, "26/09/2026") assert not valid(strict, 20260926) 合成示例只验证 date 。其他格式可能有可选依赖或实现差异,应在锁定环境中逐项测试。未知格式名称也不能被当作已经实施了某种检查;拼写错误可能让你得到毫无意义的安全感。 日期格式不是日期解释规则 来源中的 03/04/2026 可能代表三月四日,也可能代表四月三日。把它转换为 ISO 形式之前,需要来源地区、字段说明或明确协议。通过 date 校验只能说明转换后的值有效,不能证明你选对了月份。 来源情况 应做什么 不该做什么 不存在的日历日期 报错并回看原文 自动滚动到下个月 日月顺序不明 标记歧义 根据服务器语言猜测 带时间与时区 使用独立时间协议 随手截取前十字符 字段为空 按缺失规则处理 补成当天日期 把配置也纳入回归测试 测试集中至少放一个合法闰日、一个非法闰日和一个格式错误值。部署时跑这些反例,比只看 Schema 文件是否存在更有效。若服务跨语言实现,分别验证相同测试集,不要假定两个验证器默认行为一致。 译稿审查保留原始日期 把日期提取结果用于 OmniDoc(产品入口) 译稿核对时,建议同时保存 raw_text 与规范化值。审校员需要看到“原文是什么”和“系统怎样解释”,才能定位是翻译、提取还是格式转换造成的差异。 参考: JSON Schema 字符串与 format 。 - 1 -
更新于 2026-10-08