【问题标题】:Schema validation for Json array of objects using Java使用 Java 对 Json 对象数组进行模式验证
【发布时间】:2018-09-20 20:18:41
【问题描述】:

我正在为一组数据寻找 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"
    }
  ]
}

我来自http://wilddiary.com/validate-json-against-schema-in-java/ 的代码在上述情况下工作正常,但在以下情况下,它不用于检查第二条记录,即 JSON 响应有多个对象时。

多条记录的 JSON 响应:

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

我也尝试了 additionalProperties / additionalItems: false ,但它对它们中的任何一个都不起作用,我也在 Stack Overflow 中检查了一些旧帖子,但没有得到想要的结果。

还有其他方法可以实现吗?

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您使用了错误的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"
      ]
    }
    

    【讨论】:

    • 感谢您的回复,不确定您所说的错误形式的项目是什么意思..因为尽管传递了正确的值并修改了架构,但我仍然无效..请您尝试解释一下我的例子..
    • 我更新了答案以包含更正的架构。
    • 让我知道如何与您联系,因为我需要紧急解决方案,因为我为此苦苦挣扎了很长时间:(
    • 我认为您已经复制粘贴了相同的模式,因为我现在看到响应即使对于第二条记录也给出有效,尽管它传递了不正确的密钥,我假设第二条记录没有进行检查{“acc”:[{“AccId”:7377,“accName”:“test0504”,“accSysName”:“AIM”,“accLName”:“test0504”},{“AccId”:7378,“cb”:“ test0585", "accountingSystemName": "AIM", "accountLongName": "test0504" }, ] }
    • 我对架构所做的更改很小,但非常重要。我将"items": [ { ... } ] 更改为"items": { ... }。答案中描述了这两者之间的区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 2019-12-09
    相关资源
    最近更新 更多