JSON模式 - 需要嵌套字段

时间:2017-07-12 15:24:05

标签: jsonschema

var schema = {
  "id": "test.json#",
  "definitions": {
    "body": {
      "type": "object",
      "properties": {
        "name": {"type": "string"},
        "age": {"type": "integer"},
      }
    },
    "request": {
      "properties": {
        "user": {
          "$ref": "#/definitions/body"
        }
      }
    }
  },
  "typeA": {
    "$ref": "#/definitions/request"
  },
  "typeB": {
    "allOf": [
      {"$ref": "#/definitions/request"},
      {"required": ["name"]} // Should require the name field in the user object.
    ]
  }
}

var Ajv = require('ajv')
var ajv = Ajv({
  schemas: [schema]
})

var data = {
  user: {
    "name": "tom",
    "age": 1
  }
}

var valid = ajv.validate({$ref: "test.json#/typeA"}, data)
console.log('VALID', valid) // Returns true.
var valid = ajv.validate({$ref: "test.json#/typeB"}, data)
console.log('VALID', valid) // Returns false.

我是JSON架构的新手。我想在typeA和typeB中重用definitions-request-schema。 typeB应该要求user-object中的name字段。我该如何实现这一目标?我知道为什么上面的解决方案不起作用。必需应该是“user.name”。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这是一个如何要求嵌套属性

的示例
 {
    "$id": "add",
    "properties": {
      "label": {"type": "string"},
      "inputs": {"type": "array", "items": {"type": "string"}},
      "outputs": {"type": "array", "items": {"type": "string"}},
      "filter": {"type": "array", "items": {"type": "string"}},
      "componentConfig": {
        "type": "object",
        "properties": {
          "component": {"type": "string"},
          "resource": {"type": "array", "items": {"type": "string"}},
          "centerAddress": {"type": "string"}
        },
        "required": ["component", "resource"]
      }
    },
    "required": ["label", "inputs", "outputs", "filter"]
  }