В Java JSON, т.е. JavaScript Object Notation, играе много важна роля в манипулирането на отговора от страна на сървъра. В Java можем да валидираме JSON документи спрямо JSON схема. За да извършим валидирането, ние използваме networknt Валидатор на JSON схема библиотека.
Причината за използването на тази библиотека е, че тя използва Jackson като JSON библиотека и поддържа най-новата версия на JSON Schema. Библиотеката networknt е a Java внедряване на JSON Schema Core Draft v4, v6, v7 и v2019-09 (която използваме в нашия пример) спецификация за валидиране на JSON схема. Той има Jackson като анализатор на JSON по подразбиране.
Първо, вземаме пример за JSON документ и JSON схема, които използваме в нашата програма за извършване на валидиране.
JSON документ
{ 'name': 'Emma Watson', 'artist': 'Paul Walker', 'description': null, 'tags': ['oil', 'famous'] }
JSON схема
{ '$schema': 'https://json-schema.org/draft/2019-09/schema#', '$id+': 'http://my-paintings-api.com/schemas/painting-schema.json', 'type': 'object', 'title': 'Painting', 'description': 'Painting information', 'additionalProperties': true, 'required': ['name', 'artist', 'description', 'tags'], 'properties': { 'name': { 'type': 'string', 'description': 'Painting name' }, 'artist': { 'type': 'string', 'maxLength': 50, 'description': 'Name of the artist' }, 'description': { 'type': ['string', 'null'], 'description': 'Painting description' }, 'tags': { 'type': 'array', 'items': { '$ref': '#/$defs/tag' } } }, '$defs': { 'tag': { 'type': 'string', 'enum': ['oil', 'watercolor', 'digital', 'famous'] } } }
Добавяме следната зависимост в нашия файл pom.xml.
com.networknt json-schema-validator 1.0.42
Можем също да използваме org.everit.json библиотека за валидиране на JSON обекта. За да го използваме, трябва да добавим следната зависимост в нашия файл pom.xml:
org.everit.json org.everit.json.schema 1.11.1
В нашия случай използваме networknt библиотека на Java.
Използваме следните стъпки, за да потвърдим JSON документа:
- Създайте нов maven проект.
- Добавете зависимостта на валидатора на JSON схема в нашия файл pom.xml.
- Прочетете данните и схемата от JSON документа с помощта на ObjectMapper.
- Използвайте метода validate() на JsonSchemaFactory, за да потвърдите JSON документа.
- Съхранявайте върнатия резултат в набора за валидиране, отпечатайте го на екрана.
Вече всичко е настроено, така че можем да приложим действителния код за валидиране на JSON документа.
JsonValidatorExample.java
//import required classes and packages package javaTpoint.ObjectToJsonConversion; import java.io.InputStream; import java.util.Set; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.networknt.schema.JsonSchema; import com.networknt.schema.JsonSchemaFactory; import com.networknt.schema.SpecVersion; import com.networknt.schema.ValidationMessage; // create class to validate JSON document public class JsonValidatorExample { // create inputStreamFromClasspath() method to load the JSON data from the class path private static InputStream inputStreamFromClasspath( String path ) { // returning stream return Thread.currentThread().getContextClassLoader().getResourceAsStream( path ); } // main() method start public static void main( String[] args ) throws Exception { // create instance of the ObjectMapper class ObjectMapper objectMapper = new ObjectMapper(); // create an instance of the JsonSchemaFactory using version flag JsonSchemaFactory schemaFactory = JsonSchemaFactory.getInstance( SpecVersion.VersionFlag.V201909 ); // store the JSON data in InputStream try( InputStream jsonStream = inputStreamFromClasspath( 'C:\Users\ajeet\eclipse-workspace\data.json' ); InputStream schemaStream = inputStreamFromClasspath( 'C:\Users\ajeet\eclipse-workspace\schema.json' ) ){ // read data from the stream and store it into JsonNode JsonNode json = objectMapper.readTree(jsonStream); // get schema from the schemaStream and store it into JsonSchema JsonSchema schema = schemaFactory.getSchema(schemaStream); // create set of validation message and store result in it Set validationResult = schema.validate( json ); // show the validation errors if (validationResult.isEmpty()) { // show custom message if there is no validation error System.out.println( 'There is no validation errors' ); } else { // show all the validation error validationResult.forEach(vm -> System.out.println(vm.getMessage())); } } } }
Описание
В горния код използваме VersionFlag . За получаване на JsonSchemaFactory , се изисква да се предаде този флаг на версията в конструктора. В нашия случай използваме 2019-09 г версия на JSON схема.
Ние също използваме персонализиран помощен метод, т.е. inputStreamFromClasspath(), за да заредим и двата файла от classpath. Създаваме екземпляр на класа Jackson ObjectMapper за четене на JSON данните от InputStream. След това анализираме тези данни от InputStream в обект JsonNode. Използвайки екземпляра на JsonSchemaFactory, получаваме обекта JsonSchema, за да валидираме JsonNode. Ние създаваме набор от грешки при валидиране, който съдържа един или повече обекти ValidationMessage. Наборът за валидиране ще бъде празен, когато няма грешка при валидирането.
Изход