2015-04-23 35 views
0

我正在为收据创建模式,并希望为核心概念提供一个主模式,并为专门的收据类型提供各种不同的明细对象(例如,分项酒店收据等)我当前实现借力oneOf机制,JSON-模式在JSON模式中的不同对象之间进行选择

{ 
    "$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" }, 
       ... 
      ] 
     } 
    } 
} 

这种方法的问题是,当我验证(使用TV4),似乎都在oneOf指定的模式都被检查,并实际上,返回错误。通过删除detail属性,将oneOf移动到架构级别(例如properties之外),然后在每个子架构中创建根属性名称,我可以最大限度地减少这种影响。但是,即使在这种情况下,如果我验证酒店收据类型时发生错误,我会收到“丢失所需属性:generalDetail”。

所以2个问题:

  • 是它甚至有可能用一个通用的detail财产像我目前做的,而不是有验证完全验证的oneOf结构中的每个子模式(例如,我使用的oneOf错误)?
  • 如果这是不可能的,我会比单纯有一组'typed'细节属性(如'generalDetail','hotelDetail'等)更好 - 但是有没有办法指定它们是并且只有其中一个应该存在于正在验证的文档中?

TIA

回答

0

所有oneOf的模式的需要,为了要验证验证,以确保只有模式的一个通过。如果没有通过或者超过一次通过,验证器需要告诉您每个模式的验证结果,以便确定如何解决错误。

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

0
  1. 它通常使用anyOf更好 - 当你需要oneOf时,它是非常罕见的。后者将一直验证所有模式,前者很可能在第一次通过时退出。

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

相关问题