重新定义引用的JSON模式的必需属性

时间:2018-05-11 21:29:33

标签: json schema jsonschema

我的架构使用"$schema": "http://json-schema.org/draft-04/schema",并在其definitions中包含以下内容:

"lineitem": {
    "name": "Item",
    "description": "Single item found in an order.",
    "type": "object",
    "additionalProperties": true,
    "allOf":[{ "ref": "../line-item.json" }]
}

我的问题是:我需要line-item.json中的所有内容,除了一个必需的属性status,这是一个对我来说无用的枚举。我需要能够覆盖status,而无需更改引用的架构。我确实需要一个状态,我有一个定义文件,其中包含正确的信息。但是我如何把它拉进我的项目?这两个项目都需要status,但含义不同。

我试过这两个都失败了,我觉得这一定是可能的但是我做错了:

"lineitem": {
    "name": "Item",
    "description": "Single item found in an order.",
    "type": "object",
    "additionalProperties": true,
    "allOf":[{ "ref": "../line-item.json" }],
    "properties": {
        "status": { "$ref": "definitions.json#/definitions/status" }
    }
}

"lineitem": {
    "name": "Item",
    "description": "Single item found in an order.",
    "type": "object",
    "additionalProperties": true,
    "allOf":[{ "ref": "../line-item.json" }],
    "definitions": {
        "status": { "$ref": "definitions.json#/definitions/status" }
    }
},

我完全清楚解决此问题的最佳方法是重新定义line-item.json,以便status不是必需的,或者对每次使用都有不同的定义, line-item架构会选择使用。但我无权更改该架构,并且难以获得该架构的许多受影响用户的支持。

1 个答案:

答案 0 :(得分:1)

JSON Schema中的所有约束都是附加的,这意味着您无法删除添加的内容,而是需要从头开始利用合成。我的建议是拆分line-item.json

line-item.json

{
  "allOf": {
    "properties": {
      "status": {"enum": [1,2,3]}
    },
    "allOf": {
      "$ref": "line-item-without-status.json"
    }
  }
}

包含其他状态定义的订单项:

{
  "allOf": {
    "properties": {
      "status": {"$ref": "#/definitions/status"}
    },
    "allOf": {
      "$ref": "line-item-without-status.json"
    }
  }
}

共享line-item-without-status.json

{
  "type": "object",
  "properties": {
    "sharedProp": {
      "type": "string"
    }
  }
}