【问题标题】:How to make some fields optional in existing JSON shema如何在现有 JSON 模式中使某些字段可选
【发布时间】:2019-04-16 09:34:18
【问题描述】:

我想使用单个 JSON 模式在我的应用程序中创建和更新(修补)记录。问题发生在required 属性上,我不知道如何更改以进行修补。我应该允许部分更新记录。

我只能想到 2 种解决方案,但这些对我来说都不是很好。我相信一定有更好的方法。

解决方案 1: 即时修改架构以进行修补。基本上是导入架构,删除required属性或修改它,然后使用该架构进行验证。

解决方案 2: 在补丁请求中,获取现有条目,并应用来自请求的数据。

这是一个示例 json 架构:

{
  "$id": "https://myapp.com/schemas/post.schema.json",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Post",
  "description": "Blog post",
  "properties": {
    "title": {
      "type": "string",
      "description": "Post title"
    },
    "body": {
      "type": "string",
      "description": "Post content"
    }
  },
  "required": ["title", "body"]
}

最初,在创建帖子时,我需要这两个属性。后来,我想只允许更改一个条目。所以客户端只能发送到 REST API body,我应该能够根据架构正确验证它。

【问题讨论】:

  • 你能区分创建帖子和稍后在 JSON 数据中更新它吗?如果是这样,您可以使用 Draft-7 中的 if-then-else。
  • @tomredfern 你误解了这个问题。 OP 并没有以与链接问题相同的方式询问有条件地要求属性。

标签: json jsonschema json-schema-validator


【解决方案1】:

JSON Schema 不知道它是如何被使用的,因此您无法在 JSON Schema 中对其进行内在编码。

您可以创建两种模式,一种用于整个对象验证,一种用于补丁请求。在您的验证架构中,您将引用补丁架构,并添加 required

但是,我不建议这样做,因为您可能会发现以后创建和修补程序有不同的验证要求,而您无法通过这种方式进行管理。

将补丁请求应用于对象可能更自然,然后使用架构进行验证,然后保存到您的数据库(假设这是您的最后一步)。毕竟,您可能会发现您有基于其他值的验证条件(这意味着无论如何您都需要在 JSON Schema 之外进行额外验证)。

【讨论】:

    【解决方案2】:

    这些资源可能有用:

    RFC-6902 JavaScript 对象表示法 (JSON) 补丁

    https://www.rfc-editor.org/rfc/rfc6902

    JSON Patch 定义了一个 JSON 文档结构,用于表达一系列操作以应用于 JavaScript Object Notation (JSON) 文档;它适合与 HTTP PATCH 方法一起使用。 “application/json-patch+json”媒体类型用于识别此类补丁文档。

    http://jsonpatch.com/

    https://github.com/Starcounter-Jack/JSON-Patch

    “JSON-Patch 标准 (RFC 6902) 的精简 JavaScript 实现。使用增量补丁更新 JSON 文档。”

    https://www.npmjs.com/package/fast-json-patch

    使用 JSON-Patch,您可以: applyPatch 应用补丁 applyOperation 应用单个操作 验证一系列补丁 观察变化(并在检测到变化时生成补丁) 比较两个对象(以获得差异)。

    【讨论】:

      猜你喜欢
      • 2018-09-12
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 2021-10-20
      相关资源
      最近更新 更多