如何使用JSON模式验证器验证可空类型?

11

我正在使用 play-json-schema-validator,希望在Scala中设置一个集成测试,以检查API的JSON响应模式。

响应的某些字段可以为空,我想对其进行验证。因此,一些字段既可以是字符串也可以为null,但不能是数字。

其演示环境 中玩耍后,我想验证对象数组中每个对象的名称属性是字符串或null。

我想出了这个模式:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "Product set",
  "type": "array",
  "items": {
    "title": "Product",
    "type": "object",
    "properties": {
      "name": {
        "type": ["string", null]
      }
    }
  }
}

尽管它验证了字符串和空值情况,但是我现在对于数字得到了一个错误的肯定结果。我本来期望这个JSON会产生一个错误,但它却被验证通过了:

[
  {
    "name": "Red anger"
  },
  {
    "name": null
  },
  {
    "name": 13
  }
]

如何使用模式验证器声明一个类型的字段为可为空?

2个回答

13

将模式中的空值加上引号:

"type": ["string", "null"]
您可以在JSON模式验证文档中了解此内容,即:
6.1. 任何实例类型的验证关键字
6.1.1. 类型
此关键字的值必须是字符串或数组。 如果是数组,则数组的元素必须是字符串并且必须是唯一的。
字符串值必须是以下六种原始类型之一(“null”,“boolean”,“object”,“array”,“number”或“string”),或者是“integer”,它匹配具有零小数部分的任何数字。
仅当实例位于此关键字列出的任何集合中时,实例才能通过验证。

2
模式的类型属性不接受数组,而只能一次接受一个单一类型: "string", "null"... 正如你指出的那样,类型应该是字符串,所以应该用 "null" 代替 null。
如果您想检查单个字段的多个类型,则需要使用 anyOf、oneOf、allOf。
这里有一个使用您的输入的示例。
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "Product set",
  "type": "array",
  "items": {
    "title": "Product",
    "type": "object",
    "properties": {
      "name": {
        "anyOf": [
            {"type":"string"},
            {"type":"null"},
            {"type":"number"}
        ]
      }
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接