JSON模式要求执行

时间:2014-07-07 22:11:33

标签: php json jsonschema

所以这是我第一次使用JSON Schema,我对需求有一个相当基本的问题。

我的顶级架构如下:

schema.json:

{
    "id": "http://localhost/srv/schemas/schema.json",
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "event": { "$ref": "events_schema.json#" },
        "building": { "$ref": "buildings_schema.json#" }
    },
    "required": [ "event" ],
    "additionalProperties": false
}

我有两个其他模式定义文件(events_schema.json和buildings_schema.json),其中包含对象字段定义。特别感兴趣的是buildings_schema.json。

buildings_schema.json:

{
    "id": "http://localhost/srv/schemas/buildings_schema.json",
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "buildings table validation definition",
    "type": "object",
    "properties": {
        "BuildingID": {
            "type": "integer",
            "minimum": 1
        },
        "BuildingDescription": {
            "type": "string",
            "maxLength": 255
        }
    },
    "required": [ "BuildingID" ],
    "additionalProperties": false
}

我正在使用此文件来测试我的验证:

test.json:

{
    "event": {
        "EventID": 1,
        "EventDescription": "Some description",
        "EventTitle": "Test title",
        "EventStatus": 2,
        "EventPriority": 1,
        "Date": "2007-05-05 12:13:45"
    },
    "building": {
        "BuildingID": 1,
    }
}

通过验证很好。但是当我使用以下内容时:

test2.json

{
    "event": {
        "EventID": 1,
        "EventDescription": "Some description",
        "EventTitle": "Test title",
        "EventStatus": 2,
        "EventPriority": 1,
        "Date": "2007-05-05 12:13:45"
    }
}

我收到错误:[building] the property BuildingID is required

在我的buildings_schema.json文件中,我有一行"required": [ "BuildingID" ],这是导致错误的原因。 schema.json似乎遍历属性定义并强制执行所有要求。这是违反直觉的,我希望它只强制执行一个要求,如果它的父属性被强制执行。

我有几种方法涉及数组并从根本上改变JSON的结构,但这种方法违背了我尝试验证现有JSON的目的。我已阅读文档(/叹气),但未找到与此问题相关的任何内容。是否有一些简单的要求我缺少继承设置?

我从这里使用Json-Schema for PHP实现:https://github.com/justinrainbow/json-schema

1 个答案:

答案 0 :(得分:0)

在弄乱了不同的验证器之后,它似乎是验证器的问题。验证器通过引用假定所需的继承。我通过简单地将主模式拆分为子模式并在必要时仅使用所需的子模式来修复此问题。