先定义空值的含义
材料没有提供数量,与材料明确写数量为0,是两种不同事实。若程序都用count || 0兜底,缺字段、null和零会被合并,界面可能把未知显示成真实的零。
本例约定count字段必须存在:null表示材料未提供,非负整数表示材料明确给出的数量。缺字段是输出结构待核对,不自动补0。这是教学数据约定,不是Claude自动赋予null的含义。
四份对象需要四种记录
空对象表示没收到count;count:null表示收到“未知”;count:0表示明确零;count:3表示明确正数。后两者都还需回到来源核对数值是否真的被材料支持。
因此“结构通过”和“事实已确认”要分别记录。一个合法JSON字符串可能缺字段;字段存在也可能使用了错误类型。

Schema帮助约束形状,语义仍由你定义
若采用官方结构化输出,可按当前支持子集约定字段类型和必填项;请求中解释null的来源语义。不能仅要求返回JSON,再假定模型与下游理解相同的未知值。
文末函数不构造或发送Schema请求,只用Object.hasOwn检查自有字段,并区分状态。它拒绝字符串0、undefined、负数、小数及不安全整数,不做隐式类型转换。
运行四个对象
保存为missing-null-zero.mjs,用Node.js 24 LTS运行node missing-null-zero.mjs --demo。四行依次为missing、unknown、known_zero、known_positive,action分别提示结构复核、保留null或回查来源。
输出的compare_source不是事实验证通过。函数没有原始材料,无法知道3是不是模型猜的;应用需要另外保留来源位置与人工或程序核验结果。
已有默认值怎么排查
沿响应原文、JSON解析、对象转换、数据库默认值、页面显示逐层检查,找出第一次把null改成0的位置。不要只修提示词而保留下游的错误兜底。
空字符串、未回答、不适用也可能各有不同含义;业务需要时应扩展明确状态,而不是把所有东西塞成null。修改约定前保留历史语义,避免旧记录被批量重新解释。
本例没有更新真实数据
实际本地测试验证四种状态、自有属性和非法类型拒绝,没有调用模型、写库或迁移生产字段。它只针对count单字段,不是通用Schema验证器。
上线验收应使用原始资料和完整字段链路,尤其检查统计报表是否把unknown误计成零。缺少资料时保留未知,比生成一个整齐但错误的零值更准确。
参考资料与核验范围
资料核对日期:2026年10月21日。以下为官方原始资料;产品入口和可用范围仍以当前账户为准。
1. [官方资料1](https://platform.claude.com/docs/en/build-with-claude/structured-outputs)