everit json schema validator (java) ifthenelse在1.5.1版本下没有进行预期的验证。

问题描述 投票:0回答:1

我试图使用ifthenelse来验证json,但是ifelse部分并没有像预期的那样验证。当我比较 "example.json "和 "parentSchema.json "文件时......它应该会给我一个错误,因为我没有在文件中提供 "name"......但是它没有给我任何错误,并且验证成功。

尝试了多种值和多种情况,包括allOf等。尝试在不同的网站(在线编辑器)中验证我的模式,它在那里正常执行,并按照预期向我抛出错误,但在我的代码中没有。如果有人能帮助我,那将是非常有帮助的,下面是我的主类代码。

下面是我的主类代码。`

import org.everit.json.schema.Schema;
import org.everit.json.schema.loader.SchemaLoader;
import org.json.JSONObject;
import org.json.JSONTokener;

public class TestingJsonSchema {
    public static void main(String args[]) {
        JSONObject jsonSchema = new JSONObject(
                new JSONTokener(TestingJsonSchema.class.getResourceAsStream("/parentSchema.json")));
        JSONObject jsonSubject = new JSONObject(
                new JSONTokener(TestingJsonSchema.class.getResourceAsStream("/example.json")));

        //validateSchema
        try{
            Schema schemaValidator = SchemaLoader.load((jsonSchema));
            schemaValidator.validate(jsonSubject);
        }catch (Exception e){
            System.out.println(" message is :"+ e.getMessage());
        }
    }
}

`

下面是我的 pom.xml 文件。

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.everit.json</groupId>
            <artifactId>org.everit.json.schema</artifactId>
            <version>1.5.1</version>
        </dependency>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

下面是我的父级json文件 "parentSchema.json"。

   {
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "id": {
      "enum": ["Russia", "Canada"]
    },
    "name": {
      "type": "string"
    },
    "price": {
      "type": "number"
    }
  },
  "if": {
    "properties": { "id": { "const" : "Russia" }}
  },
  "then": {
    "required": ["name"]
  },
  "else": {
    "required": ["price"]
  }
}

下面是我实际要验证的json文件 "example.json"。

{
  "id": "Russia",
  "price": 10.50
}

它应该给我一个错误,因为我没有发送 "name",但它验证成功,好像 "IFTHENELSE "块从来没有被执行。

java json maven jsonschema json-schema-validator
1个回答
1
投票

问题是你使用的是旧版本的 org.everit.json.schema. 很明显,1.5.1版本不支持 if-then-else 构造。

修复方法是编辑你的 pom.xml 并取代

        <dependency>
            <groupId>org.everit.json</groupId>
            <artifactId>org.everit.json.schema</artifactId>
            <version>1.5.1</version>
        </dependency>

        <dependency>
            <groupId>com.github.everit-org.json-schema</groupId>
            <artifactId>org.everit.json.schema</artifactId>
            <version>1.12.1</version>
        </dependency>

并将以下存储库添加到 <repositories> 你的 pom.xml 文件。 (如果 <repositories> 元素不存在,就创建它)。)

        <repository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </repository>

也请参见 Maven安装 一节。

我对你的项目做了这样的修改,运行后产生了下面的输出。

 message is :#: #: only 1 subschema matches out of 2
© www.soinside.com 2019 - 2024. All rights reserved.