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