根据为属性指定的值验证Json模式

时间:2019-06-18 06:31:38

标签: json jsonschema json-schema-validator

我有一个Json请求,其中包含以下数据和对应的json模式

根据此请求,我想根据模式填写一些字段

说,如果mode为1,那么我希望obj1中的字段a和b是必需的,而obj3中的字段x是必需的。 现在,如果模式为2,则需要obj2中的字段p,q和r,如果需要,则需要obj1中的字段a和c,而如果需要,则需要obj3中的字段y。 接下来,如果模式为3,则只需要字段a和c

Json请求

@ComponentScan({"com.*"})

编辑-根据@gregsdennis的建议更改了架构以进行验证

JSON模式

{
  "mode": "1",
  "obj1": {
      "a": 12,
      "b": "test",
      "c": "18 June 2019"
      },
 "obj2": {
      "p": 100,
      "q": "new",
      "r": "19 June 2019",
      "s" : "test2"
      },
  "obj3": {
      "x": 12,
      "y": "test3"
      }
}


**Json schema**
{
  "definitions": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://example.com/root.json",
  "type": "object",
  "properties": {
    "mode": {
      "$id": "#/properties/mode",
      "type": "string",
      "examples": [
        "1"
      ]
    },
    "obj1": {
      "$id": "#/properties/obj1",
      "type": "object",
      "title": "The Obj 1 Schema",
      "properties": {
        "a": {
          "$id": "#/properties/obj1/properties/a",
          "type": "integer",
          "examples": [
            12
          ]
        },
        "b": {
          "$id": "#/properties/obj1/properties/b",
          "type": "string",
          "examples": [
            "test"
          ]
        },
        "c": {
          "$id": "#/properties/obj1/properties/c",
          "type": "string",
          "examples": [
            "18 June 2019"
          ]
        }
      }
    },
    "obj 2": {
      "$id": "#/properties/obj2",
      "type": "object",
      "title": "The Obj 2 Schema",
      "properties": {
        "p": {
          "$id": "#/properties/obj2/properties/p",
          "type": "integer",
          "examples": [
            100
          ]
        },
        "q": {
          "$id": "#/properties/obj2/properties/q",
          "type": "string",
          "examples": [
            "new"
          ]
        },
        "r": {
          "$id": "#/properties/obj2/properties/r",
          "type": "string",
          "examples": [
            "19 June 2019"
          ]
        },
        "s": {
          "$id": "#/properties/obj2/properties/s",
          "type": "string",
          "examples": [
            "test2"
          ]
        }
      }
    },
    "obj 3": {
      "$id": "#/properties/obj3",
      "type": "object",
      "title": "The Obj 3 Schema",
      "properties": {
        "x": {
          "$id": "#/properties/obj3/properties/x",
          "type": "integer",
          "examples": [
            12
          ]
        },
        "y": {
          "$id": "#/properties/obj3/properties/y",
          "type": "string",
          "examples": [
            "test3"
          ]
        }
      }
    }
  }
}

因此,简而言之,不管我拥有多少种模式,字段或对象,我都希望在特定的时间在特定模式下仅需要从不同对象中选择的几个字段。 任何人都可以建议任何解决方案来实现这一目标吗?可以在json模式中进行此类验证吗?

1 个答案:

答案 0 :(得分:1)

您想要的是oneOf,其中每个子模式为obj*每个属性给出一个有效状态。每个状态都是这样的:

{
  "properties": {
    "mode": {"const": 1},
    "obj1": {"required": ["a","b"]},
    "obj3": {"required": ["x"]}
  }
}

为问题中列出的每个州创建其中一个州,然后将其全部放入位于根源的oneOf中。

可以使用if / then / else来做到这一点,但是在这种情况下,我希望使用oneOf来避免嵌套。


此外,我注意到您中间有很多多余的$id,它们只是在模式中指定了它们的位置。您想要一个作为根,但是您不需要其他。实现可以轻松地算出这些基于位置的引用。