JSON 与数据处理指南

JSON Schema oneOf:验证带类型标记的联合结构

用 const 类型标记区分分支,理解 oneOf 恰好命中一个分支的要求。

Nav Tools ·

定义两类消息

oneOf 要求恰好一个子 Schema 通过,用必填的 tag 和不同 const 值使选择条件明确。

先写两类合成消息,不要仅凭一个生成类型的样例推断联合约定。

{"oneOf":[
 {"type":"object","properties":{"kind":{"const":"email"},"to":{"type":"string"}},"required":["kind","to"]},
 {"type":"object","properties":{"kind":{"const":"sms"},"phone":{"type":"string"}},"required":["kind","phone"]}]}

验证只命中一个分支

kind 为 email 且 to 是字符串时,第一分支通过,sms 分支因标记不符而失败。

只把标记改成 sms,再确认缺失 phone 会失败,可将分支选择与字段类型分开验证。

{"kind":"email","to":"demo@example.com"} → valid
{"kind":"sms","to":"demo@example.com"} → invalid

避免分支重叠

两个分支都接受同一对象时,oneOf 仍失败,即使各分支内没有类型错误;anyOf 允许一个或多个分支通过。

按协议决定:互斥消息类型适合 oneOf,多个可接受条件则可能适合 anyOf。

明确额外字段策略

示例没有禁止额外字段;若协议要求封闭结构,应在每个完整对象分支内设置 additionalProperties 为 false。

阅读完整错误列表,未选中分支报错属于预期,选中分支仍须满足其必填约束。

参考资料

← JSON 与数据处理指南