先给结论:不要只改输入框里的示例,而要把“对象格式”当成输入规范的上游变量重新声明。对象格式变了,意味着字段结构、层级、必填项和可接受的值域都可能变;输入规范如果只改表面格式,校验规则、默认值和错误提示仍按旧对象工作,就会出现“看起来提交成功、后续处理却对不上”的矛盾。正确顺序是:先确认新旧对象的差异类型,再决定是扩展规范、加转换层,还是拒绝旧输入。
一个常见现象是:工具升级后支持了新的对象格式,用户按旧习惯粘贴或导入,界面没有报错,但生成的结果、匹配的字段或后续动作与预期不一致。有人会认为“工具坏了”,也有人认为“旧数据不能用了”。这两种判断都可能过早。
更合理的解释通常有两类。第一类是输入规范仍然接受旧格式,但内部已按新对象解析,导致字段被静默丢弃或错位;第二类是输入规范已经要求新格式,但校验只检查了外层结构,没有检查嵌套字段或值域。前者是兼容层缺失,后者是校验不完整。两者表现相似,处理方式完全不同。
要区分这两种解释,可以设计一个最小对照:用同一份内容分别构造“旧格式完整版”和“新格式完整版”,只改变对象结构,不改内容本身。然后观察工具在三个位置的表现:导入或提交时的提示、预览或映射结果、以及后续动作实际使用的字段。
这里的关键证据不是“有没有报错”,而是报错发生在哪一层,以及错误信息是否指向具体字段。只看到请求量或提交量归零,不能单独证明规范改对了;也可能是上游数据源换了格式、调用方尚未更新,或校验变严后正常拦截了旧输入。需要结合字段级日志或对照样本判断。
在改规范之前,先写一份“对象格式差异表”,只列三类内容:新增字段、删除字段、含义变化字段。对每个字段标注旧对象中的位置、新对象中的位置、是否必填、允许的值类型。这个动作的结果会直接影响下一步:如果差异集中在新增字段,输入规范可以向后兼容,把新字段设为可选并给默认值;如果删除或含义变化字段占多数,继续兼容旧输入会制造歧义,更稳妥的做法是提高规范版本并要求调用方显式声明对象格式。
假设一个场景:旧对象用扁平字段 title 表示标题,新对象改为 content.title。如果规范只把示例从 title 改成 content.title,但没有声明旧字段是否仍被接受,调用方可能继续传 title,工具内部却只读 content.title,结果标题为空。此时应该做的是:在输入规范中明确写出 title 已废弃、content.title 为必填,并让校验在缺少该字段时给出字段级错误,而不是静默通过。
对象格式变化后,输入规范至少要在四个位置同步调整,否则改了一处仍会留下遗漏条件。
这四处的调整顺序建议从字段契约开始,再补结构声明和转换规则,最后统一错误反馈。因为字段契约决定了哪些旧输入还能用,哪些必须拒绝;先改错误提示容易掩盖真正的规范冲突。
保留旧格式成立的条件通常是:旧字段与新字段语义一致,只是位置或名称变化;旧字段不是必填;转换规则可以无损执行。满足这些条件时,输入规范可以声明一个兼容期,并记录旧字段的废弃状态。兼容期的长度应由调用方更新节奏决定,而不是由工具方单方面设定。
必须拒绝旧格式的条件通常是:字段含义发生变化,旧值在新对象中无法一一对应;旧字段与新字段同时出现且可能冲突;或者旧格式缺少新对象必需的嵌套结构。此时继续接受旧输入,只会把错误推迟到后续环节。更合理的做法是让校验直接失败,并在错误信息中说明需要声明的对象格式版本。
无论选择哪种,都要避免一个动作:只更新输入示例,不更新校验和错误反馈。示例是给人看的,校验才是给机器执行的;对象格式变化后,真正决定行为的是校验规则和转换规则,而不是示例文本。