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

使用allof和complex if else进行jsonschema验证

宇文飞羽
2023-03-14

在这里输入image description我有一个如下所示的json模式,我希望根据B和C的值将定义加载到D和E中,为此我已经编写了所有的条件。我使用json-schema-validator在应用程序中进行json模式验证。

{
      "$schema": "http://json-schema.org/draft-07/schema#",
      "type": "object",
      "required": [
        "A",
        "B",
        "C",
        "D",
        "E"
      ],
      "properties": {
        "A": {
          "type": "string"
        },
        "B": {
          "type": "string",
          "enum": ["TEST1","TEST2"]
        },
        "C": {
          "type": "string",
          "enum": ["TEST3","TEST4"]
        },
        "D": {
          "type": "object"
        },
        "E": {
          "type": "object"
        }
      },
      "allOf": [
        {
          "if": {
            "properties": { "B": { "const": "TEST1" } }
          },
          "then": {
            "properties": { "D": {  "$ref": "#/definitions/test" } }
          }
        },
        {
          "if": {
            "properties": { "B": { "const": "TEST2" } }
          },
          "then": {
            "properties": { "D": {  "$ref": "#/definitions/testTwo" } }
          }
        },
        {
          "if": {
            "properties": { "C": { "const": "TEST3" } }
          },
          "then": {
            "properties": { "E": {  "$ref": "#/definitions/testThree" } }
          }
        },
        {
          "if": {
            "properties": { "C": { "const": "TEST4" } }
          },
          "then": {
            "properties": { "E": {  "$ref": "#/definitions/test4" } }
          }
        }
      ],

      "definitions": {
       "testOne":{"type":"object"},
       "testTwo":{"type":"object"},
       "testThree":{"type":"object"},
       "testFour":{"type":"object"}
        }
    }

javaCode看起来像

@PostMapping("/sendMessage")
    public ProcessingReport sendMessage(@RequestBody SampleRequest request) throws IOException, ProcessingException {

        //step-1 writing request object into String
        String requestJson = objectMapper.writeValueAsString(request);

        //Step-2 getting jsonNode for requested json
        JsonNode dataNode = JsonLoader.fromString(requestJson);

        //step -3 creating jsonSchema factory(default)
        JsonSchemaFactory factory = JsonSchemaFactory.byDefault();
        //validating requested jsonNode(dataNode) against SchemaNode(schema of request json,which is loaded from resources)
        ProcessingReport report = factory.getJsonSchema(schemaNode).validate(dataNode);


        //Processing report resulting the given json validation is successful or not
        if(!report.isSuccess()) {
            System.out.println(report);
        }
        return report;
    }

共有1个答案

党航
2023-03-14

json-schema-validator只支持draft-03和draft-04。如果/,则/常量将添加到以后的草稿中。这些关键字会被忽略,从而导致您正在经历的无操作行为。

你有两个选择

  1. 选择支持Draft-07的其他实现
  2. 改为使用蕴涵模式。有点冗长,但结果是一样的。
 类似资料:
  • 样本数据 我使用AJV 6.10.0来验证我的数据,但我认为我有一个错误的模式定义。带Ajv选项: 实际上,我有6个错误,警告每个属性的其他属性 在验证allOf(姓名和电话)中的第一个对象时,验证在(地址、邮政编码、城市和州)中发现错误 如果我删除了第一个allOf对象(姓名、电话)的附加属性,在验证地址架构的过程中,验证会在(姓名和电话)上发现错误 如何解决模式定义

  • 有人能帮助我了解如何使用RobotFramework通过JSON-Schema验证json响应吗? 理想情况下,通过http请求外部引用json-schema:示例http://api-bl-uk.northeurope.cloudapp.azure.com/api/v1/crm/schemas/contact 当我做测试的时候... 所以我似乎错过了一个相当基本的谜题: 找不到名为“Valida

  • 问题内容: 我想为在Raspberry Pi上运行并像本地服务器一样工作的软件制作一些更新脚本。该服务器应连接到Web上的主服务器,以获取软件更新并验证软件的许可证。为此,我设置了两个python脚本。我希望它们通过TLS套接字连接。然后,客户端检查服务器证书,然后服务器检查它是否是授权的客户端之一。我在此页面上找到了解决方案。 现在还有一个问题。我想知道 哪个客户端 (取决于证书)正在建立连接。

  • 但请求呢?和是用户的属性,但应将它们发送到endpoint。如果我将资源发送到endpoint,则没有多大意义。 对此有没有办法,遵循JSONAPI并保持API的意义?

  • JsonSchema.net是一个从JSON数据自动生成JSON Schema的工具. 模式生成根据 IETF JSON Schema Internet Draft. 草案规范, 此工具包括5个主要功能: 接受JSON输入,并根据此输入生成秒速此JSON输入的JSON Schema Provides a GUI to modify the schema generated with useful

  • 我正在尝试验证Json Objects。我使用https://code.google.com/p/rest-assured/wiki/Downloads?tm=2, greeter-schema.json:http://cs606926.vk.me/v606926718/15603/0Kauo1bTDi8.jpg 即使JsonString不等于这个“{\”isSuccess\“:false}”,我