Skema JSON ialah alat yang berkuasa untuk mengesahkan struktur data JSON boleh difahami sebagai corak atau peraturan.
Skema Json mentakrifkan satu set perbendaharaan kata dan peraturan, yang digunakan untuk mentakrifkan metadata Json, dan metadata juga dinyatakan dalam bentuk data Json. Metadata Json mentakrifkan spesifikasi yang perlu dipenuhi oleh data Json. Spesifikasi termasuk ahli, struktur, jenis, kekangan, dsb.
Skema JSON ialah perihalan format, definisi dan templat json Dengannya, anda boleh menjana sebarang data json yang memenuhi keperluan
Dalam Java, json-schema-validator
digunakan untuk mengesahkan format data json. diperkenalkan , mereka
jackson-core
Jika format data yang ingin kami sahkan adalah seperti berikut: jackson-core
<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>
json-schema-validator
Di luar adalah jenis dan data. , dan bahagian dalamnya ialah Array, atribut tatasusunan termasuk jantina, nama, umur{ "data": [ { "sex": "男", "name": "王小明", "age": 18 }, { "sex": "女", "name": "王小红", "age": 17 } ], "type": "human" }
Json di atas menerangkan format data json sasaran Lapisan luar mesti mempunyai medan jenis dan data, yang mengehadkan nama maksimum Panjang
ialah 3, jantina ialah nilai penghitungan dan hanya boleh mengambil dua rentetan lelaki dan perempuan, dan umur ialah nombor jenis. 3. Pelaksanaan kod{ "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 untuk disahkan, dan kemudian memanggil kaedah maxLength
untuk mengesahkan json masuk Di sini
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; }
validator.json
4 JsonSchemaFactory.byDefault().getValidator().validate(jsonNodeSchema, jsonNode, true)
true
{jantina=nilai medan jantina salah, tidak diketahui tidak berada dalam julat penghitungan, nama=Wang Xiaoming1 panjang medan terlalu panjang, umur=ralat jenis umur, jenis sedia ada: rentetan, jenis jangkaan :["integer ","number"]}5. RingkasanJika skema ditulis menggunakan kurungan segi empat sama untuk senarai, maka apabila mengesahkan Hanya sekeping data pertama dalam tatasusunan akan disemak, yang merupakan perangkap, seperti yang ditunjukkan di bawahJika ini berlaku, hanya sekeping data pertama dalam tatasusunan data akan disemak, yang lain mungkin mempunyai ralat Tiada ralat akan dilaporkan! !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); }Salin selepas log masukAtas ialah kandungan terperinci Bagaimana untuk mengesahkan sama ada format json memenuhi keperluan dalam java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!