使用Java的Json对象数组的模式验证

时间:2018-04-11 04:52:31

标签: java json schema jsonschema json-schema-validator

我在java代码中寻找数据数组的JSON Schema验证。

我的JSON架构是

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "acc": {
      "type": "array",
      "items": [
        {
          "type": "object",
          "properties": {
            "AccId": {
              "type": "integer"
            },
            "accName": {
              "type": "string"
            },
            "accSysName": {
              "type": "string"
            },
            "accLName": {
              "type": "string"
            }
           },
          "required": [
            "AccId",
            "accName",
            "accSysName",
            "accLName"
          ]
        }
      ]
    }
  },
  "required": [
    "acc"
  ]
}

而我对1条记录的JSON响应是

{
  "acc": [
    {
      "AccId": 123,
      "accName": "test",
      "accSysName": "ABC",
      "accLName": "test"
    }
  ]
}

{{}}}中的代码在上述情况下工作正常,但在下面的情况下,它不会检查第二条记录,即JSON响应有多个对象时。

多条记录的JSON响应:

{
  "acc": [
    {
      "AccId": 123,
      "accName": "test",
      "accSysName": "Abc",
      "accLName": "test"
    },
    {
      "pqr": 456,
      "qwe": "test2",
      "accSysName": "ghu",
      "accLName": "test3"
    }
  ]
}

我尝试使用additionalProperties / additionalItems:false,但它不适用于其中任何一个,我在Stack Overflow中检查了几个旧帖子,但没有得到所需的结果。

还有其他方法可以使用吗?

2 个答案:

答案 0 :(得分:0)

验证您的json响应。将json响应复制并粘贴到下面的链接中 https://jsonformatter.curiousconcept.com/

它会告诉你你的json是否有效

答案 1 :(得分:0)

您使用的是错误的items形式。你想要的表格应该是这样的。

{
  "type": "array",
  "items": { "type": "string" }
}

这将验证所有项目都是字符串

["foo", "bar"]

另一种形式的items描述了类似元组的东西。

{
  "type": "array",
  "items": [
    { "type": "string" }
    { "type": "integer" }
  ]
}

这验证数组的第一项是字符串,第二项是整数。通过第二项的任何内容都将被忽略(除非您使用additionalItems

["foo", 1]

因此,在您的架构中,您已经定义了一个元素的元组,其余元素被忽略。切换到第一个表单,它将按预期工作。

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "acc": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "AccId": {
            "type": "integer"
          },
          "accName": {
            "type": "string"
          },
          "accSysName": {
            "type": "string"
          },
          "accLName": {
            "type": "string"
          }
        },
        "required": [
          "AccId",
          "accName",
          "accSysName",
          "accLName"
        ]
      }
    }
  },
  "required": [
    "acc"
  ]
}