everit json средство проверки схемы (java) if / then / else не проверяется должным образом в версии 1.5.1 - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь использовать if / then / else для проверки json, но часть if / else / не проверяется должным образом. Когда я сравниваю "example. json" с файлом "parentSchema. json" ... предполагается, что это вызовет у меня ошибку, поскольку я не указываю "имя" в файле .. но это не вызывает у меня никаких проблем. ошибка и успешная проверка.

Пробовал несколько значений и несколько сценариев ios, включая все и другие c. Пытался проверить мои схемы на разных веб-сайтах (онлайн-редакторах), они там работают правильно и выдают мне ошибку, как ожидалось, но не в моем коде. Было бы очень полезно, если бы кто-нибудь мог мне помочь.

ниже - мой основной код класса. `

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 для проверки "пример. json".

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

Это должно вызвать у меня ошибку, так как я не отправляю "имя "но он проходит успешно, как будто блок" IF / THEN / ELSE "никогда не выполнялся.

1 Ответ

1 голос
/ 09 мая 2020

Проблема в том, что вы используете старую версию 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 installation README проекта.

Я сделал это изменение в вашем проекте, запустил его и получил следующий результат:

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