Как выполнить проверку длины при определенных условиях с помощью средства проверки схемы Json?

#json #jsonschema

Вопрос:

У меня есть структура схемы json, которая выглядит следующим образом.

 {
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "description": "My sample Json",
  "type": "object",
  "properties": {
    "eventId": {
      "description": "The event Indetifier",
      "type": [ "number", "string" ]
    },
    "serviceType": {
      "description": "The service type. It can be either ABC or EFG",
      "enum": [ "ABC", "EFG" ]
    },
    "parameters": { "$ref": "/schemas/parameters" }
  },
  "required": [ "eventId", "serviceType" ],
  "$defs": {
    "parameters": {
      "$id": "/schemas/parameters",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "description": "Other Parameters",
      "type": "object",
      "properties": {
        "activityType": {
          "description": "The activity type",
          "type": [ "null", "string" ]
        },
        "activitySubType": {
          "description": "The activity sub type",
          "type": [ "null", "string" ]
        }
      }
    }
  }
}
 

Теперь у меня есть требование выполнить некоторую логику проверки.

  1. Если EventID == «100» и ServiceType == «ABC», то parameters.activityType не должен быть равен нулю и должен иметь минимальную длину 10.
  2. Если EventID == «200» и ServiceType == «EFG», то параметр.activitySubType не должен быть равен нулю и должен иметь минимальную длину 20.

Я пытаюсь выполнить проверку, используя условие «если, то иначе». Я не уверен, как добавить это в средство проверки схемы Json.

Кто-нибудь может помочь мне с синтаксисом? Возможно ли это сделать?

Комментарии:

1. Вы просмотрели документацию? json-schema.org/understanding-json-schema/reference/…

Ответ №1:

Это определенно возможно. Для первого требования:

 {
  ...
  "if": {
    "required": [ "eventId", "serviceType" ],
    "properties": {
      "eventId": {
        "const": "100"
      },
      "serviceType": {
        "const": "ABC"
      }
    }
  },
  "then": {
    "required": [ "parameters" ],
    "properties": {
      "parameters": {
        "properties": {
          "activityType": {
            "type": "string",
            "minLength": 10
        }
      }
    }
  },
  ...
}
 

«Обязательные» ключевые слова есть, потому что, если свойство вообще не существует, подсхема «если» будет подтверждена как истинная, чего вы не хотите-вам нужно сказать «если это свойство существует, и его значение …, то …».

Второе требование очень похоже на первое. Вы можете использовать несколько ключевых слов «если»/»еще» в схеме одновременно, обернув их в allOf: "allOf": [ { ..schema 1..}, { ..schema 2.. } ]

Комментарии:

1. Спасибо вам за ответ. Это работает. Есть ли способ указать пользовательское сообщение об ошибке, в котором объясняется, какие свойства отсутствуют. В настоящее время это не ясно из сообщения об ошибке?

2. Возможно; вам придется проверить документацию оценщика, которого вы используете.