接受的有效负载的JSON模式与返回的对象

时间:2016-04-18 18:39:20

标签: json jsonschema

我正在为RESTful网络服务充实模式,我对一件小事感到有点难过。想象一下,如果我有以下架构:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "required": ["name"],
  "properties": {
    "name": {
      "type": "string"
    },
    "urn": {
      "type": "string"
    }
  }
}

由于URN是由我的服务生成的,因此我不想在客户请求中接受它。因此urn数组中不包含required。但是,它在响应中是必需的,因此我无法使用此架构来验证我的服务提供的响应。我不想使用两种不同的模式,而是必须保持同步。

有没有办法使用单一模式来严格模拟这两种情况?或者,如果我需要使用两个模式,有没有办法引用一个公共结构模式,只是覆盖我的请求和响应模式中的required字段?

2 个答案:

答案 0 :(得分:2)

这是一个已知问题,没有好办法处理它。

将其保留在一个模式中的唯一方法是不在required数组中包含服务器生成的属性,并在服务器端执行其他检查以验证这些属性。

不,无法覆盖架构关键字。 JSON Schema关键字始终为集合添加约束。您需要从公共模式开始,并使用allOf从那里扩展。

以下是您需要做的事情的一个例子。

创作架构:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://example.com/create-my-schema",
  "type": "object",
  "required": ["name"]
  "properties": {
    "name": {
      "type": "string"
    }
  }
}

完整架构:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://example.com/my-schema",
  "allOf": [{ "$ref": "http://example.com/create-my-schema" }],
  "required": ["urn"],
  "properties": {
    "urn": {
      "type": "string"
    }
  }
}

如果你不关心模式的人类可读性,这种方法很好。否则,有些人选择在服务器端动态构建模式,因此生成的模式可能有重复,但代码没有。

答案 1 :(得分:0)

您可以使用动态架构,使用" oneOf "

{
    "type" : "object",
    "required" : ["name"],
    "properties" : {
        "name" : {
            "oneOf" : [{
                    "$ref" : "#/definitions/withURN"
                }, {
                    "$ref" : "#/definitions/withoutURN"
                }
            ]
        }
    },
    "definitions" : {
        "withURN" : {
            "properties" : {
                "name" : {
                    "type" : "string"
                },
                "urn" : {
                    "type" : "string"
                }
            }
        },
        "withoutURN" : {
            "properties" : {
                "name" : {
                    "type" : "string"
                }
            }
        }
    }
}

举个例子看看:http://json-schema.org/example2.html

这个讨论主题:How to use dependencies in JSON schema (draft-04)