Как сделать схему json достаточно гибкой, чтобы обрабатывать ввод enum с учетом регистра? - PullRequest
0 голосов
/ 31 января 2020

Пожалуйста, обратитесь к этому вопросу для введения Двусторонние привязки зависимости, основанные на значении перечисления в json схема .

Теперь дело в том, что если я передам userType = CUSTOMER, то это не принимает запрос, а также в случае userType = customer.

Может кто-нибудь предложить мне JSON схему решения для этого?

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Нет способа сделать это, который не является ужасным, но наименее ужасная вещь, о которой я могу подумать, это использовать pattern с регулярным выражением, которое включает оба случая.

{
  "type": "string",
  "anyOf": [
    { "title": "Customer", "pattern": "[Cc][Uu][Ss][Tt][Oo][Mm][Ee][Rr]" },
    { "title": "Admin", "pattern": "[Aa][Dd][Mm][Ii][Nn]" },
  ]
}

(title не требуется, просто бедняга, который должен прочитать эту схему)

0 голосов
/ 08 февраля 2020

Это был именно тот случай использования, который я пытался решить за последние пару дней. Ясно одно, что схема не поддерживает его напрямую.

Теперь, если вы используете какой-либо сторонний инструмент проверки схемы, они могут дать вам некоторый интерфейс для написания вашего собственного средства проверки настройки (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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...