为名为" type"的属性创建类型定义使用JSON模式

时间:2016-07-18 21:57:51

标签: json jsonschema

我正在尝试为现有的JSON文件创建一个JSON模式,如下所示:

{
  "variable": {
    "name": "age",
    "type": "integer"
  }
}

在架构中,我想确保type属性的值为stringinteger

{
  "variable": {
    "name": "string",
    "type": {
      "type": "string",
      "enum": ["string", "integer"]
    }
  }
}

不幸的是,它会消息:ValidationError {is not any of [subschema 0]...

我已经读到有#34;没有保留字"在JSON模式中,所以我假设一种类型是有效的,假设我正确地声明了它?

2 个答案:

答案 0 :(得分:1)

根据the specification,在Valid types的{​​{1}}部分:

  

此关键字的值必须是字符串或数组。如果它是一个数组,那么数组的元素必须是字符串,并且必须是唯一的。   字符串值必须是核心规范定义的七种基本类型之一。

稍后,在type

  

如果实例的原始类型是关键字定义的类型之一,则实例匹配成功。回想一下:“数字”包括“整数”。

在你的情况下:

Conditions for successful validation

答案 1 :(得分:0)

jruizaranguren 接受的答案实际上并没有回答这个问题。

问题在于,给定具有名为“type”的字段的 JSON(不是 JSON 模式,JSON 数据),很难编写不会阻塞的 JSON 模式。

假设您有一个现有的 JSON 数据提要(数据,而不是架构),其中包含:

"ids": [ { "type": "SSN", "value": "123-45-6789" },
         { "type": "pay", "value": "8675309" } ]

我在尝试解决同样的问题时发现的是,而不是把

"properties": {
                    "type": {                 <======= validation chokes on this 
                        "type": "string"
}

你可以放

"patternProperties": {
                    "^type$": {
                        "type": "string"
}

但我仍在研究如何将其标记为必填字段。这可能是不可能的。

我认为,基于查看原始问题中的“模式”,JSON 模式从那时起已经发展了很多 - 但这仍然是一个问题。可能有更好的解决方案。