簡體   English   中英

如何使 json 模式足夠靈活以處理枚舉的區分大小寫的輸入?

[英]how to make the json schema flexible enough to handle case sensitive input for enum?

json schema 中基於枚舉值的兩種方式綁定依賴的介紹請參考這個問題。

現在的情況是,如果我通過userType = CUSTOMER那么它不接受請求,在userType = customer的情況下也是如此。

任何人都可以為此建議我 JSON 模式解決方案嗎?

沒有辦法做到這一點並不可怕,但我能想到的最不可怕的事情是將pattern與包含這兩種情況的正則表達式一起使用。

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

title不是必需的,對於必須閱讀此架構的可憐的開發人員來說只是一個好處)

這是我過去幾天試圖解決的確切用例,很明顯的一件事是架構不直接支持它。

現在,如果您使用某種第三方模式驗證器工具,他們可能會給您一些接口來編寫您自己的自定義驗證器( https://github.com/everit-org/json-schema

我們可以做的另一種方法是在驗證數據之前對數據進行預處理。 假設在您的情況下,userType 是不區分大小寫的值,並且僅為一組值(客戶、客戶、客戶)。 因此,我建議將枚舉值保留為customer [小寫],並且在您的 JSON 將模式驗證器預處理之前,將特定鍵中的所有值作為小寫值。

預處理您的 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 編寫類似的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM