[英]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.