2016-11-22 42 views
1

我想创建一个文档的JSON模式,其中某些对象中的字段值应该针对同一文档中另一个对象中定义的枚举进行验证。Json模式验证对象的值与另一个对象的内容

更具体地说,在下面的例子中,我希望能够用idvalues(我应该能够在不同的json文件中定义不同的属性)定义“属性”。 然后,“对象”应该能够引用这些属性,以便object.properties[i].id必须与其中一个属性的id匹配,并且object.properties[i].value必须与为该属性定义的某个枚举值匹配。

{ 
    "properties": [ 
     { 
      "id": "SIZE", 
      "values": ["small", "medium", "big"] 
     }, 
     { 
      "id": "MATERIAL", 
      "values": ["wood", "glass", "steel", "plastic"] 
     }, 
     { 
      "id": "COLOR", 
      "values": ["red", "green", "blue"] 
     } 
    ], 

    "objects": [ 
     { 
      "name": "chair", 
      "properties": [ 
       { 
        "id": "SIZE", 
        "value": "small" 
       }, 
       { 
        "id": "COLOR", 
        "value": "red" 
       } 
      ], 
     }, 
     { 
      "name": "table", 
      "properties": [ 
       { 
        "id": "MATERIAL", 
        "value": "wood" 
       } 
      ] 
     } 
    ] 
} 

我试图创建JSON架构验证这样的结构,但卡住了与描述为“属性”对象的内场参考。我也查看了standard,并没有找到实现目标的方法。

是否有可能创建一个json模式来验证我的json文件?

回答

1

有一个建议$data reference,几乎允许这样做,如果你改变你的数据结构一点点,以消除一个层次的间接。这是supported in Ajv(我是作者)。

所以,如果你的数据是:

{ 
    "properties": { 
     "SIZE": ["small", "medium", "big"], 
     "MATERIAL": ["wood", "glass", "steel", "plastic"], 
     "COLOR": ["red", "green", "blue"] 
    }, 
    "objects": { 
     "chair": { 
      "SIZE": "small", 
      "COLOR": "red" 
     }, 
     "table": { 
      "MATERIAL": "wood" 
     } 
    } 
} 

那么你的架构可能是:

{ 
    "type": "object", 
    "properties": { 
     "properties": { 
      "type": "object", 
      "additionalProperties": { 
       "type": "array", 
       "items": { "type": "string" } 
      } 
     }, 
     "objects": { 
      "type": "object", 
      "additionalProperties": { 
       "type": "object", 
       "properties": { 
        "SIZE": {"enum": {"$data": "3/properties/SIZE"}}, 
        "MATERIAL": {"enum": {"$data": "3/properties/MATERIAL"}}, 
        "COLOR": {"enum": {"$data": "3/properties/MATERIAL"}} 
       } 
      } 
     } 
    } 
} 

它可以根据可能的属性的所有名单上的动态生成。

使用数据结构,您可以使用自定义关键字,如果验证程序支持它们或实现JSON模式之外的某些验证逻辑部分。

+0

谢谢,尤其是!这是否意味着使用json schema v4是不可能的? 很高兴认识某人正在努力! – Mikhail

+0

正确,不适用于v4 – esp

+0

实际上,即使使用$ data,也只有部分可能,如果降低间接级别。我将编辑。 – esp

相关问题