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

接受的有效负载与返回的对象的JSON模式,json,jsonschema,Json,Jsonschema,我正在充实一个RESTful web服务的模式,但有一件小事让我有些困惑。想象一下,如果我有以下模式: { "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "required": ["name"], "properties": { "name": { "type": "string" }, "urn": { "type": "string

我正在充实一个RESTful web服务的模式,但有一件小事让我有些困惑。想象一下,如果我有以下模式:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "required": ["name"],
  "properties": {
    "name": {
      "type": "string"
    },
    "urn": {
      "type": "string"
    }
  }
}
因为URN是由我的服务生成的,所以我不想在客户端请求中接受它。因此
urn
不包括在
required
数组中。但是,它是响应中必需的,因此我不能使用此模式来验证我的服务提供的响应。我不希望使用两种不同的模式,而是希望它们保持同步


有没有一种方法可以使用一个模式对这两种情况进行严格建模?或者,如果我需要使用两个模式,是否有方法引用一个通用的结构模式,并从我的请求和响应模式中重写
required
字段?

您可以通过使用“oneOf”来使用动态模式

例如,请看一下:


还有这个讨论主题:

您可以通过使用“oneOf”来使用动态模式

例如,请看一下:


还有这个讨论主题:

这是一个已知的问题,没有好的方法来处理它

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

不,无法覆盖架构关键字。JSON模式关键字始终向集合添加约束。您需要从公共模式开始,然后使用
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"
    }
  }
}

如果您不关心模式的人类可读性,那么这种方法很好。否则,有些人会选择在服务器端动态构建模式,这样生成的模式可能会有重复,但代码不会。这是一个已知的问题,没有好的方法来处理它

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

不,无法覆盖架构关键字。JSON模式关键字始终向集合添加约束。您需要从公共模式开始,然后使用
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"
    }
  }
}

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

这看起来会在任何上下文中验证
{“name”:“foo”,“urn”:“bar”}
,这不是我想要的;仅将模式与这两个属性一起使用就可以做到这一点。我想要两个仅在
required
字段的值上不同的模式,而不必复制/粘贴这两个模式。看起来它将在任何上下文中验证这两个
{“name”:“foo”,“urn”:“bar”}
,这不是我想要的;仅将模式与这两个属性一起使用就可以做到这一点。我想要两个仅在
required
字段的值上不同的模式,而不必复制/粘贴这两个模式。当然,这并不理想,但我认为我可以使用它。谢谢当然,这并不理想,但我想我可以接受。谢谢