首页 文章

为多个JSON模式重用一个对象

提问于
浏览
0

我有两个单独的JSON模式(用于验证REST API的HTTP请求 endpoints ),它们都接受相同的确切对象,但具有不同的必需字段(这是创建与更新请求) . 有没有办法可以重用此对象的单个定义并仅更改必填字段?我知道如何使用 $ref 将对象重用为另一个对象的属性,但我无法弄清楚如何将整个对象重用为模式中的顶级对象 . 到目前为止我失败的尝试:

event.json

{
  "id": "event",
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "start_date": {
      "type": "integer"
    },
    "end_date": {
      "type": "integer"
    },
    "description": {
      "type": "string"
    }
  },
  "additionalProperties": false
}

事件create.json

{
  "id": "event-create",
  "type": "object",
  "$ref": "event",
  "additionalProperties": false,
  "required": [ "name", "description" ]
}

显然,事件' into the definition of ' event-create',包括ID等 . 我试过推荐 event#/properties 无济于事 . 我似乎无法将 $ref 作为属性属性中的唯一值 . 有任何想法吗?

2 回答

  • 1

    应忽略JSON Reference对象中除“$ ref”以外的任何成员 . - http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03#section-3

    这就是为什么你的例子不起作用的原因 . 应该忽略 $ref 字段以外的任何内容 .

    $ref 的支持仅限于类型为JSON Schema的字段 . 这就是为什么尝试将它用于 properties 无效 . properties 是一个普通对象,其值为JSON模式 .

    执行此操作的最佳方法是使用 allOf . 在这种情况下, allOf 可以被认为是一个mixin模式列表 .

    {
      "id": "event-create",
      "type": "object",
      "allOf": [{ "$ref": "event" }],
      "required": ["name", "description"]
    }
    
  • 4

    我发现一些似乎有用的语法,但我对它并不十分满意:

    {
      "id": "event-create",
      "allOf": [
        { "$ref": "event" },
        { "required": [ "name", "description" ] }
      ]
    }
    

    似乎滥用 allOf 运算符,特别是对于没有必填字段的另一种情况(因此只有一个元素包含在 allof 中) . 但它确实有效,所以除非有人有更好的想法,否则我会继续使用它 .

相关问题