everitjson模式验证器(java)if/then/else在1.5.1版本下没有进行预期的验证



我试图使用if/then/else来验证json,但if/else/部分没有按预期进行验证。当我将"example.json"与"parentSchema.json"文件进行比较时。。假设它会给我一个错误,因为我没有在文件中提供"名称"。。但它并没有给我带来任何错误,也没有成功验证。

尝试了多个值和多个场景,包括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",但它正在成功验证,就好像"if/THEN/ELSE"块从未执行过一样。

问题是您使用的是旧版本的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>

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

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

另请参阅项目README的Maven安装部分。

我对您的项目进行了更改,运行了它,它生成了以下输出:

message is :#: #: only 1 subschema matches out of 2

最新更新