当前位置: 首页 > 知识库问答 >
问题:

用另一个JSON模式验证JSON模式

方风华
2023-03-14

我试图使用另一个JSON模式来验证JSON模式。

要验证的JSON模式示例:https://jsonschema.net/home

验证上述模式的验证模式参考:https://github.com/ajv-validator/ajv/blob/master/lib/refs/json-schema-draft-07.json

{
    "$schema": "http://json-schema.org/draft-07/schema",
    "$id": "http://example.com/example.json",
    "type": "object",
    "title": "The root schema",
    "description": "The root schema comprises the entire JSON document.",
    "default": {},
    "examples": [
        {
            "name": "A green door"
        }
    ],
    "required": [
        "name"
    ],
    "properties": {
        "name": {
            "$id": "#/properties/name",
            "type": "string",
            "title": "The name schema",
            "description": "An explanation about the purpose of this instance.",
            "default": "",
            "examples": [
                "A green door"
            ]
        }
    },
    "additionalProperties": true
}
  definitions: {
    simpleTypes: {
      enum: ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'],
    }
  },
  properties: {
  type: {
      anyOf: [
        { $ref: '#/definitions/simpleTypes' },
      ],
    },
  }

从上面的simpletypes->enum中,如果我删除object,我的JSON将变得无效。

我有什么方法可以定义根类型枚举属性中存在的类型不同吗?

共有1个答案

东门胤
2023-03-14

首先创建一个draft-07模式的副本,并给它一个唯一的$id

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "https://example.com/my-custom-draft-07-schema",
  "definitions": {
    ...original-definitions...
  },
  ...original-schema...
}

由于您希望模式在不同的地方有不同的约束,因此需要将模式重构为定义,以便在不同的情况下可以引用和扩展它。不要忘记更改所有递归引用({“$ref”:“#”})以指向您创建的定义({“$ref”:“#/definitions/schema”})。

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "https://example.com/my-custom-draft-07-schema",
  "alllOf": [{ "$ref": "#/definitions/schema" }],
  "definitions": {
    ...original-definitions-with-modified-$refs...
   "schema": {
      ...original-schema-with-modified-$refs...
    }
  }
}

接下来,您需要添加另一个特定于属性模式的定义,并更改属性模式的$refs以使用已创建的定义({“$ref”:“#/definitions/property-schema”})。不要忘记更改patternpropertiesadditionalproperties以及properties。其他关键字,如anyof,应该继续引用泛型架构({“$ref”:“#/definitions/schema”})。

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "https://example.com/my-custom-draft-07-schema",
  "alllOf": [{ "$ref": "#/definitions/schema" }],
  "definitions": {
    ...original-definitions-with-modified-$refs...
    "schema": {
      ...original-schema-with-modified-$refs...
    },
    "property-schema": {
      "allOf": [{ "$ref": "#/definitions/schema" }]
    }
  }
}
{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "https://example.com/my-custom-draft-07-schema",
  "alllOf": [{ "$ref": "#/definitions/schema" }],
  ...add-root-schema-constraints-here...
  "definitions": {
    ...original-definitions-with-modified-$refs...
    "schema": {
      ...original-schema-with-modified-$refs...
      ...add-global-constraints-here...
    },
    "property-schema": {
      "allOf": [{ "$ref": "#/definitions/schema" }]
      ...add-property-schema-constraints-here...
    }
  }
}
 类似资料:
  • 我有一个用例,我将把一个json-schema作为输入,验证它,然后保存在我的系统中。稍后,我将获取json数据,我需要使用上面提到的json-schema来验证这些数据。给定这个场景,我需要执行两个级别的验证: 我使用的是json-schema-validator jar,只能找到第二级验证,在文档中找不到json-schema验证。例如:假设我们有以下示例json-schema:

  • 问题内容: 有没有一种方法可以针对该结构的JSON模式验证JSON结构?我已经查看并发现JSON.Net验证了,但这并不能满足我的要求。 JSON.net可以: 这证明是正确的。 这也证明是真的 仅此验证为假。 理想情况下,我希望它可以验证那里也没有应该存在的字段。 问题答案: 我认为您只需要添加 到您的架构。这将停止提供未知属性。 因此,现在您的结果将是:-正确,错误,错误 测试代码… 输出:-

  • 这是要根据模式验证的JSON。 问题是,如果我们传递了错误的数据,它将正确地验证eid和ename的类型(即整数或字符串)。对于例如: 如果我们为限定传递了错误的类型,那么它将验证为true(即,它不验证限定的类型,可能是因为它是嵌套的)。

  • 我对根据JSON模式验证JSON文档不感兴趣。我想验证JSON模式本身,检查它是否针对特定草案有效。是否有工具Java可以验证模式本身?

  • 我在验证JSON时遇到了一些错误。我无法理解这些错误,有人能帮我解释一下吗。 } 这是json。 消息:JSON与“anyOf”中的任何模式都不匹配。架构路径: 消息:无效类型。应为数组,但得到的是字符串。架构路径: 消息:值“标识”载体“未在枚举中定义。架构路径: 消息:字符串“uui # abb 0 ef 56-8562-4056-aa62-AFB 758 a 150 ad”未根据格式“uri

  • 我想通过KafkaRest代理产生一个Kafka主题。我已经在模式注册表中创建了一个JSON模式,我希望所有消息都根据注册的模式进行验证,如果它们与模式不匹配,则拒绝。 我的模式 此架构已正确注册并分配了版本1。然后我尝试为和生成一个数据类型错误的消息,但是消息被接受。 请注意,我正在生成一个与模式关联的