我试图使用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 "块从来没有被执行。
问题是你使用的是旧版本的 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