JSON Schema est un outil puissant pour valider la structure de données JSON. Le schéma peut être compris comme un modèle ou une règle.
Json Schema définit un ensemble de vocabulaire et de règles, qui sont utilisés pour définir les métadonnées Json, et les métadonnées sont également exprimées sous la forme de données Json. Les métadonnées Json définissent les spécifications auxquelles les données Json doivent répondre. Les spécifications incluent les membres, les structures, les types, les contraintes, etc.
JSON Schema est la description du format, la définition et le modèle de json. Avec lui, vous pouvez générer toutes les données json qui répondent aux exigences
En Java, pour vérifier le format de données json, utilisez. json-schema-validator, des exemples spécifiques sont les suivants : json-schema-validator
,具体实例如下:
<dependency> <groupId>com.github.fge</groupId> <artifactId>json-schema-validator</artifactId> <version>2.2.6</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.3.0</version> </dependency>
jackson-core
和 jackson-core
是必须要引入的,他们为 json-schema-validator
必须的
如果我们要校验的数据格式如下:
{ "data": [ { "sex": "男", "name": "王小明", "age": 18 }, { "sex": "女", "name": "王小红", "age": 17 } ], "type": "human" }
外面是type和data,里面是一个数组,数组属性包括sex、name、age
编写schema文件
{ "type": "object", "properties": { "type": { "type": "string" }, "data": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string", "maxLength": 3 }, "sex": { "enum": [ "男", "女" ] }, "age": { "type": "number" } }, "required": [ "name", "sex", "age" ] } } }, "required": [ "type", "data" ] }
以上json描述了目标json的数据格式,外层必须字段type、data,里面限制了name的最大长度 maxLength
为3,sex 为枚举值,只可取 男、女两个字符串,age 为number类型。
public Map validatorJsonUnchecked(String body) { Map<String, String> map = new HashMap<>(); String filePath = "validator" + File.separator + "validator.json"; ObjectMapper objectMapper = new ObjectMapper(); try { JsonNode jsonNodeSchema = objectMapper.readTree(ResourceUtil.readUtf8Str(filePath)); JsonNode jsonNode = objectMapper.readTree(body); ProcessingReport processingReport = JsonSchemaFactory.byDefault().getValidator().validate(jsonNodeSchema, jsonNode, true); if (!processingReport.isSuccess()) { processingReport.forEach(processingMessage -> { JsonNode missing = processingMessage.asJson().get("missing"); String keyword = processingMessage.asJson().get("keyword").asText(); // 如果缺失字段 if (!Objects.isNull(missing)) { missing.forEach(miss -> { String text = miss.asText(); map.put(text, text + " 字段缺失"); }); // 如果字段超长 } else if ("maxLength".equals(keyword)) { String field = processingMessage.asJson().get("instance").get("pointer").asText(); String value = processingMessage.asJson().get("value").asText(); field = field.substring(field.lastIndexOf("/") + 1); map.put(field, value + " 字段长度过长"); // 如果不在枚举范围内 } else if ("enum".equals(keyword)) { String field = processingMessage.asJson().get("instance").get("pointer").asText(); String value = processingMessage.asJson().get("value").asText(); field = field.substring(field.lastIndexOf("/") + 1); map.put(field, field + "字段值错误," + value + "不在枚举范围内"); } else if ("type".equals(keyword)) { String field = processingMessage.asJson().get("instance").get("pointer").asText(); String found = processingMessage.asJson().get("found").asText(); String expected = processingMessage.asJson().get("expected").toString(); field = field.substring(field.lastIndexOf("/") + 1); map.put(field, field + " 类型错误,现有类型: " + found + ", 预期类型:" + expected); } }); } } catch (IOException | ProcessingException e) { log.error("校验json格式异常", e); } return map; }
以上代码首先获取了 要校验的json的标准文件 validator.json
,然后调用 JsonSchemaFactory.byDefault().getValidator().validate(jsonNodeSchema, jsonNode, true)
方法对传进来的json 进行了校验,这里 true
的意思是深度检查,如果没有这个参数,校验json的时候遇到第一个错误,就直接返回了
接下来构建测试方法
public static void main(String[] args) { ValidatorService validatorService = new ValidatorServiceImpl(); Map<String, Object> body = new HashMap<>(); HashMap<String, Object> one = new HashMap<String, Object>() {{ put("name", "王小明"); put("sex", "男"); put("age", 18); }}; HashMap<String, Object> two = new HashMap<String, Object>() {{ put("name", "王小明1"); put("sex", "未知"); put("age", "18"); }}; body.put("type", "human"); body.put("data", Arrays.asList(one,two)); Map map = validatorService.validatorJsonUnchecked(JSONUtil.toJsonStr(body)); System.out.println(map); }
{sex=sex字段值错误,未知不在枚举范围内, name=王小明1 字段长度过长, age=age 类型错误,现有类型: string, 预期类型:["integer","number"]}
如果schema 编写的时候,对列表使用了中括号 []
{ "type": "object", "properties": { "type": { "type": "string" }, "data": { "type": "array", "items": [ { "type": "object", "properties": { "name": { "type": "string", "maxLength": 3 }, "sex": { "enum": [ "男", "女" ] }, "age": { "type": "number" } }, "required": [ "name", "sex", "age" ] } ] } }, "required": [ "type", "data" ] }
jackson-core
et jackson-core.
doit être introduit, ils sont nécessaires pour json-schema-validator
maxLength
est de 3, le sexe est une valeur d'énumération et ne peut prendre que deux chaînes mâle et femelle, et l'âge est de type numéro. 🎜validator.json
du json à vérifier, puis appelle JsonSchemaFactory.byDefault() .getValidator La méthode ().validate(jsonNodeSchema, jsonNode, true)
vérifie le json entrant. Ici, true
signifie une inspection approfondie. S'il n'y a pas de tel paramètre, vérifiez le json. Lorsqu'il rencontre la première erreur, il est renvoyé directement🎜🎜Ensuite, construisez la méthode de test🎜rrreee[]
pour la liste, alors seul le premier du tableau sera vérifié lors de la vérification. C'est un piège, comme suit🎜rrreee🎜Si tel est le cas, seul le premier. élément de données dans le tableau de données sera vérifié 🎜 S'il y a d'autres erreurs, aucune erreur ne sera signalée ! ! 🎜🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!