在机器人型号资料库里,JSON Schema 常被用来描述一条记录应当长成什么形状。但"形状"与"事实"是两件事:模式可以规定某个字段只能取若干值之一,也可以规定它必须等于某个固定值,却不能替我们证明这个值来自制造商、适用于某个具体批次。JSON Schema 官方参考的 enum 条目把 enum 描述为把值限制在一个固定集合内的关键字,该集合必须是非空数组且元素唯一,并且允许集合里出现字符串、null、数字等不同类型的成员。同一参考的 const 条目则说明 const 把值限制为单一值,该关键字自 draft 6 起可用。读懂这两个关键字,是读懂机器人型号记录条件约束的第一步。
enum 表达的是"从这组里挑一个",const 表达的是"只能是这一个"。两者都属于条件约束,但阅读方式不同:看到 enum,读者应当去数一数集合里有几项、各项的类型是否一致、是否包含 null;看到 const,读者应当去确认这个唯一值本身是什么、它是否依赖某个版本或上下文。把 enum 误读成 const,会以为字段只有一个合法值;把 const 误读成 enum,会以为还有别的候选。在机器人型号资料库中,这种误读会直接影响筛选、导入和验收逻辑。
假设我们为资料库设计一个虚构字段 productCategory,用来给型号条目分类。如果写成 {"enum": ["industrial_arm", "mobile_platform", "collaborative_unit"]},含义是:该字段只能取这三个字符串之一,取其他字符串就不合规。如果改成 {"const": "industrial_arm"},含义变成:该字段必须恰好等于这一个字符串,任何别的值都不合规。前者保留了类别之间的选择空间,后者把选择空间压缩成一个点。两者都只说明"什么值能通过校验",都不说明这个类别是否与制造商公开资料一致。
另一个虚构字段schemaFlavor可以用于标记这份教学目录的版本。若约束只接受一个指定字符串,const可以直接表达这一条件;只包含同一个值的单元素enum集合也能表达相同的取值限制。因此,不能把enum一概解释成至少有两个候选。选用哪种写法可以在教学材料中说明理由,而不是宣称另一种写法必然产生歧义。
这是本文最需要划清的边界。JSON Schema 校验回答的是"这个值在不在允许集合里"或"这个值等不等于固定值",它不回答"这个值是不是真的"。一条虚构记录写 {"productCategory": "industrial_arm"} 在 enum 约束下会通过,但这不代表该型号真的是工业机械臂,也不代表制造商这样分类。同理,{"schemaFlavor": "robotdatabase.cn/v1"} 通过 const 校验,只说明标识符拼写正确,不说明记录内容已经核实。把校验通过当成参数真实,是资料库工作中常见的越界。

在机器人型号资料库的字段设计里,建议把"条件约束"与"事实来源"分成两层来记。条件约束层写 enum 或 const 的具体内容,说明哪些值可以通过模式;事实来源层写这个值的出处、核对日期和核对人。例如,虚构字段 productCategory 的 enum 集合可以来自内部目录约定,但每个型号实际归入哪个类别,应当引用制造商公开资料或内部评审记录。两层混在一起,会让读者误以为通过校验的值就是已核实的值。
这种分层也方便处理版本演化。当 enum 集合随目录版本扩大或缩小时,条件约束层可以更新,而事实来源层保留原有核对记录。如果只用一个字段同时承担两种职责,更新时很容易丢掉"这个值当初是怎么确认的"这类信息。机器人型号资料库的价值,很大程度上来自这种可追溯性。
例如,只包含一个类别字符串的enum,与把const设为该字符串,在这个虚构字段的取值比较上可以得到相同限制。读者应检查实际内容,不能只凭关键字名称推断存在多少候选。若示例另外包含类型或其他条件,还要保留那些条件;这里的比较只讨论同一个指定值,不把局部说明扩展为所有模式都等价。
设想一次虚构的导入任务:外部文件提供一批机器人型号条目,其中 productCategory 字段取值有 "industrial_arm"、"mobile_platform" 和一个拼写错误的 "industrial_arm_"。模式校验会拦下拼写错误,但不会告诉我们 "industrial_arm" 这个值是否与制造商资料一致。审阅者应当先让模式校验发挥过滤作用,再对通过校验的条目逐条核对来源。如果审阅者跳过第二步,就会把"通过校验"误当成"类别已确认",这正是本文反复提醒要避免的越界。
再设想同一批教学文件把这个固定版本标识都填对了。单看此项条件,只能说明它们符合所示固定值要求,不能说明记录的其他部分已经核实。如果还存在必填字段、类型或其他约束,仍需分别检查。本文没有执行一次真实导入,也不把这些虚构条目当作已通过完整模式校验的数据。

最后,建议机器人型号资料库在字段说明里明确写出阅读方法:遇到 enum,先列出集合成员,再确认待检值是否在集合内;遇到 const,先确认固定值本身,再比较待检值是否相等。同时写明:无论哪种条件通过校验,都不代表字段值已经核实为真实参数。这样的说明不复杂,却能把模式校验的边界讲清楚,避免读者把工具能力误认为事实保证。
对资料库维护者来说,enum 与 const 的选择是一次业务判断:字段是否存在多个合法候选,还是只允许一个固定值。把这次判断的理由记录下来,与条件本身一起保存,后续使用者就能理解为什么某个字段用 enum、另一个字段用 const。条件约束、事实来源、阅读方法三者分开,资料库才能既支持自动校验,又不夸大校验的意义。 相关资料可继续浏览机器人型号资料栏目与文章目录。