Это был именно тот случай использования, который я пытался решить за последние пару дней. Ясно одно, что схема не поддерживает его напрямую.
Теперь, если вы используете какой-либо сторонний инструмент проверки схемы, они могут дать вам некоторый интерфейс для написания вашего собственного средства проверки настройки (https://github.com/everit-org/json-schema)
Есть еще один способ, которым мы можем сделать, это предварительно обработать данные перед их проверкой. Допустим, в вашем случае userType - это значение, которое не учитывает регистр и представляет собой только набор значений (Customer, customer, CUSTOMER). Поэтому я бы предложил оставить значение enum как customer [в нижнем регистре], и перед тем, как ваш JSON собирается обработчик схемы, предварительно обработайте его, чтобы поместить все значения в указатель c в качестве строчной буквы.
Код для предварительной обработки JSON может выглядеть следующим образом: CONVERT_TO_LOWER_CASE_KEY_SET - Набор ключей без учета регистра при проверке.
private JsonObject preProcessInputJsonObject(JsonObject inputJsonBody) {
inputJsonBody.forEach(innerObject -> {
if (innerObject.getValue() instanceof String) {
String value = (String) innerObject.getValue();
if (value.trim().isEmpty())
inputJsonBody.putNull(innerObject.getKey());
else if (CONVERT_TO_LOWER_CASE_KEY_SET.contains(innerObject.getKey()))
inputJsonBody.put(innerObject.getKey(), value.trim().toLowerCase());
else
inputJsonBody.put(innerObject.getKey(), value.trim());
}
if (innerObject.getValue() instanceof JsonObject)
inputJsonBody.put(innerObject.getKey(), preProcessInputJsonObject((JsonObject) innerObject.getValue()));
if (innerObject.getValue() instanceof JsonArray)
inputJsonBody.put(innerObject.getKey(), preProcessJsonArray((JsonArray) innerObject.getValue()));
});
return inputJsonBody;
}
private JsonArray preProcessJsonArray(JsonArray inputJsonArray) {
List jsonArrayList = inputJsonArray.copy().getList();
final int size = jsonArrayList.size();
for (int iterator = 0; iterator < size; iterator++) {
if (jsonArrayList.get(iterator) instanceof String) {
String val = (String) jsonArrayList.get(iterator);
if (val.trim().isEmpty())
jsonArrayList.set(iterator, null);
else
jsonArrayList.set(iterator, val.trim());
}
if (jsonArrayList.get(iterator) instanceof JsonObject)
jsonArrayList.set(iterator, preProcessInputJsonObject((JsonObject) jsonArrayList.get(iterator)));
if (jsonArrayList.get(iterator) instanceof JsonArray)
jsonArrayList.set(iterator, preProcessJsonArray((JsonArray) jsonArrayList.get(iterator)));
}
return new JsonArray(jsonArrayList);
}
Примечание: Я также пытался удалить лишние пробелы в строке перед проверкой.
Надеюсь, что это полезно, дайте мне знать, если вы видите какие-либо проблемы в этом.
И последнее, мой код данных предварительной обработки в java надеюсь, вы можете написать что-то подобное и в js.