在JSON模式中选择不同的对象

时间:2015-04-23 00:02:48

标签: jsonschema json-schema-validator

我正在为收据创建架构,并希望拥有核心概念的主架构,其中包含各种不同的详细对象,用于专门的收据类型(例如逐项的酒店收据等)。我当前的实施是利用{{ JSON-schema中的机制

oneOf

这种方法的问题在于,当我验证(使用tv4)时,似乎正在检查{ "$schema": "http://json-schema.org/draft-04/schema#", "title": "Receipt", "type": "object", "properties": { ... "amount": { "type": "number" }, "detail": { "type": "object", "oneOf": [ { "$ref": "general-detail.schema.json" }, { "$ref": "hotel-detail.schema.json" }, ... ] } } } 中指定的所有模式,并且实际上是返回错误。我可以通过删除oneOf属性,将detail移动到模式级别(例如oneOf之外)然后在每个子属性中创建根属性名称来最小化此效果模式。但是,即使在这种情况下,如果我在验证酒店收据类型时出现错误,我会收到“缺少必需的财产:generalDetail”。

所以有2个问题:

  • 甚至可以使用我正在做的通用properties属性,而不是验证器完全验证detail结构中的每个子模式(例如我使用{{1错误的)?
  • 如果不可能的话,仅仅拥有一组'typed'细节属性(比如'generalDetail','hotelDetail'等)就更好了 - 但有没有办法指明它们是一个如果要验证的文档中只存在其中一个?

TIA

2 个答案:

答案 0 :(得分:1)

  1. 通常使用anyOf更好 - 当你需要oneOf时很少。后者将总是验证所有模式,前者最有可能在第一次传递时退出。

  2. 您可以查看其他一些验证器。 tv4与标准有许多偏差,也很慢。 https://github.com/ebdrup/json-schema-benchmark

答案 1 :(得分:0)

需要验证oneOf中的所有模式,以便验证程序确保只有一个模式通过。如果没有通过或多次传递,验证器需要告诉您每个模式的验证结果,以便您确定如何修复错误。

因此,仅仅因为验证器告诉您为什么每个模式都失败并不意味着它期望所有这些模式都通过。