Json属性结构依赖于另一个属性

时间:2018-05-09 13:19:21

标签: jsonschema

我一直在研究json架构,以验证我的某个Web服务的答案。

答案分为两个属性:datastatus。如果status.code设置为0,则data必须遵守特定架构。否则,如果status.code设置为-1,则不会读取data,因此我不想检查它是否遵循架构。

这是架构:

{
    "$schema": "http://json-schema.org/schema#",
    "id": "file://registration.json",
    "type": "object",
    "properties": {
        "status": {
            "$ref": "#/definitions/classes/status"
        }
    },
    "anyOf": [
        {
            "$ref": "#/definitions/conditions/status-is-ok"
        },
        {
            "$ref": "#/definitions/conditions/status-is-nok"
        }
    ],
    "definitions": {
        "classes": {
            "status": {
                "type": "object",
                "properties": {
                    "code": {
                        "type": "integer"
                    },
                    "message": {
                        "type": "string"
                    }
                },
                "required": [
                    "code",
                    "message"
                ]
            },
            "data": {
                "type": "object",
                "properties": {
                    "propertyA": {
                        "type": "#/definitions/classes/metadatauser"
                    },
                    "propertyB": {
                        "type": "#/definitions/classes/membreinfo"
                    }
                },
                "required": ["propertyA", "propertyB"]
            }
        },
        "conditions": {
            "status-is-ok": {
                "status": {
                    "properties": {
                        "code": 0
                    }
                },
                "data": {
                    "$ref": "#/definitions/classes/data"
                }
            },
            "status-is-nok": {
                "status": {
                    "properties": {
                        "code": -1
                    }
                },
                "data": {
                    "type": "object"
                }
            }
        }
    }
}

这是一个不应该验证的例子:

{
    "data": {},
    "status": {
        "code": 0,
        "message": "OK"
    }
}

目前,这部分代码通过了,我不知道为什么。

1 个答案:

答案 0 :(得分:0)

你在这里遇到了一些问题,所以我会尝试解释所有这些问题。你走在正确的轨道上了!

"properties": {
    "code": 0
}
  

“属性”的值必须是一个对象。此对象的每个值   必须是有效的JSON模式。

http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.5.4

您不能将期望的值作为属性键的值。 但是,您可以使用[const][1]关键字来实现特定的值验证。

"$ref": "#/definitions/conditions/status-is-ok"
...
"conditions": {
  "status-is-ok": {
    "status": {
      "properties": {
  

[definitions]关键字的值必须是一个对象。每个成员的价值   对象必须是有效的JSON模式。

https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-9

这意味着您需要将定义中每个键的每个值视为JSON模式。如果您有一个JSON模式,而您没有在properties对象中嵌套“status”,则不会进行验证。 “数据”也是如此。

(严格地说,根据规范的定义部分,你不能在模式对象中深深地嵌套模式,但这似乎得到了一些实现的支持,并使用正确的解析规则解析。前缀可能更好。 )

完整的固定架构如下。

{
  "$schema": "http://json-schema.org/schema#",
  "id": "file://registration.json",
  "type": "object",
  "properties": {
    "status": {
      "$ref": "#/definitions/classes/status"
    }
  },
  "anyOf": [
    {
      "$ref": "#/definitions/conditions/status-is-ok"
    },
    {
      "$ref": "#/definitions/conditions/status-is-nok"
    }
  ],
  "definitions": {
    "classes": {
      "status": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "message"
        ]
      },
      "data": {
        "type": "object",
        "properties": {
        },
        "required": [
          "propertyA",
          "propertyB"
        ]
      }
    },
    "conditions": {
      "status-is-ok": {
        "properties": {
          "status": {
            "properties": {
              "code": {
                "const": 0
              }
            }
          },
          "data": {
            "$ref": "#/definitions/classes/data"
          },
        },
        "additionalProperties": false
      },
      "status-is-nok": {
        "properties": {
          "status": {
            "properties": {
              "code": {
                "const": -1
              }
            }
          },
          "data": {
            "type": "object"
          },
        },
        "additionalProperties": false
      }
    }
  }
}

如果其中任何一项没有意义,请告诉我。 如果您想进一步讨论任何方面,请随意加入JSON Schema slack服务器!很高兴也在这里发表评论。