Как я могу сделать несколько полей «обязательными» в зависимости от условия?

Например; в приведенном ниже случае, если status==Failed, мне нужны только четыре обязательных поля ("orgId", "идентификатор подразделения", "фондАутТип", "статус") но любое другое значение status изменит обязательный список полей: ("transactionId", "Идентификатор организации", "идентификатор подразделения", "фондАутТип", "сумма вывода", "статус")

Мое решение ниже не работает. Пожалуйста помоги.

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "versionId": "1.0",
    "javaInterfaces": [
        "java.io.Serializable"
    ],
    "type": "object",
    "properties": {
        "transactionId": {
            "type": "string"
        },
        "orgId": {
            "type": "string"
        },
        "subunitId": {
            "type": "string"
        },
        "fundOutType": {
            "type": "string"
        },
        "fundOutAmount": {
            "type": "string"
        },
        "status": {
            "type": "string"
        },
        "lang": {
            "type": "string"
        },
        "transactionCreatedDateTime": {
            "type": "integer",
            "format": "date-time"
        },
        "userId": {
            "type": "string"
        }
    },
    "if": {
        "properties": {
            "status": {
                "const": "Failed"
            }
        },
        "required": [ "status" ]
    },
    "then": {
        "required": [
            "orgId",
            "subunitId",
            "fundOutType",
            "status"
        ]
    },
    "else": {
        "required": [
            "transactionId",
            "orgId",
            "subunitId",
            "fundOutType",
            "fundOutAmount",
            "status"
        ]
    }
}
0
Shashank 11 Ноя 2019 в 20:50
Что не работает? Я попробовал это на jsonschema.dev, и, похоже, все в порядке. Можете ли вы привести пример экземпляра, который не должен или не должен пройти, но проходит?
 – 
gregsdennis
11 Ноя 2019 в 22:20
Что не работает, так это --> хотя status==success и json имеют 4 поля ("orgId", "subunitId", "fundOutType", "status"); валидация пройдена. Это должно потерпеть неудачу.
 – 
Shashank
12 Ноя 2019 в 03:34
Я получаю сообщение об ошибке, когда экземпляр имеет только 4 поля, а статус совсем не «Ошибка». Попробуйте здесь: jsonschema.dev
 – 
gregsdennis
12 Ноя 2019 в 04:29
1
Ваша схема верна. Я предполагаю, что используемый вами валидатор либо имеет ошибку, либо не поддерживает черновик 07, где были введены ключевые слова if/then/else.
 – 
Jason Desrosiers
12 Ноя 2019 в 20:28
Какую библиотеку и версию валидатора вы используете, поддерживает ли она схему draft-07?
 – 
Ashutosh
13 Ноя 2019 в 10:30

1 ответ

Вы можете использовать предложение oneOf вместо if/else:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "versionId": "1.0",
  "javaInterfaces": [
    "java.io.Serializable"
  ],
  "type": "object",
  "properties": {
    "transactionId": {
      "type": "string"
    },
    "orgId": {
      "type": "string"
    },
    "subunitId": {
      "type": "string"
    },
    "fundOutType": {
      "type": "string"
    },
    "fundOutAmount": {
      "type": "string"
    },
    "status": {
      "type": "string"
    },
    "lang": {
      "type": "string"
    },
    "transactionCreatedDateTime": {
      "type": "integer",
      "format": "date-time"
    },
    "userId": {
      "type": "string"
    }
  },
  "oneOf": [
    {
      "properties": {
        "status": {
          "const": "Failed"
        }
      },
      "required": [
        "orgId",
        "subunitId",
        "fundOutType",
        "status"
      ]
    },
    {
      "required": [
        "transactionId",
        "orgId",
        "subunitId",
        "fundOutType",
        "fundOutAmount",
        "status"
      ]
    }
  ]
}

См. документацию https:// json-schema.org/draft/2019-09/json-schema-core.html#rfc.section.9.2.1

0
afaulconbridge 20 Ноя 2019 в 14:54