不清楚propertyNames的含义

时间:2018-10-19 18:03:57

标签: jsonschema

这是使用propertyNames的JSON模式:

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "propertyNames": {"enum": ["num", "name"]}
}

我“认为”该模式的含义是:一个符合条件的JSON实例必须是一个对象,并且该对象必须包含“ num”属性和“ name”属性; 这两个属性的值未指定。正确吗,该模式意味着什么?

我创建了这个实例:

{
   "num": 10
}

我根据架构验证了该实例,验证器表示该实例有效。嗯,为什么?模式是否未指定对象必须同时包含“ num”和“ name”?

3 个答案:

答案 0 :(得分:2)

propertyNames是必须针对其所有对象属性有效的架构。让我们看一个不太混乱的示例。

{
  "type": "object",
  "propertyNames": { "maxLength": 3, "minLength": 3 },
  "patternProperties": {
    "": { "type": "number" }
  }
}

这描述了一个对象,其中所有属性名称的长度必须为3,所有属性值的长度必须为数字。这是一个例子。

{
  "usd": 1,
  "eur": 0.86815,
  "gbp": 0.76504,
  "cad": "1.31004",  <= Invalid property value
  "xx": 1.11         <= Invalid property name
}

回到您的示例,有一个属性"num",它对propertyNames模式{ "enum": ["num", "name"] }有效。因此,您的示例中的值是有效的。

答案 1 :(得分:0)

我对json-schema所采用的模式方法并不熟悉,并且发现示例或定义或实现都令人困惑。但是,我的解释是,属性名称是由枚举定义的,可以是数字列表

"propertyNames": {"enum": [1,2,3,4]}

或姓名列表

"propertyNames": {"enum": ["Ellen","Sue","James","Tim"]}

一个外部押注(我怀疑)应该是:

"propertyNames": {"enum": [1, "Ellen", 2, "Sue", 3, "James", 4, "Tim"]}

我可以看到您的示例有效的唯一情况是,单词"enum"是否打算用枚举类型代替,并且枚举只能有一个不需要使用的值一个数组,但同样有效的应该是: {"num": [8,9,10]} {"name": ["Ellen","Sue","James","Tim"]}

很抱歉,如果这不是您想要的明确答案,但我希望它可以帮助触发解决方案。

答案 2 :(得分:0)

尝试一下:

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "required": ["num", "name"]
}

您还可以像这样指定属性的类型:

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "required": ["num", "name"]
    "properties": {
        "num": {"type": "number"},
        "name": {"type": "string"}
    }
}

有关更多信息,您可以访问以下链接:https://json-schema.org/understanding-json-schema/reference/object.html