V Javi ima JSON, tj. JavaScript Object Notation, zelo pomembno vlogo pri manipulaciji odziva na strani strežnika. V Javi lahko potrdimo dokumente JSON glede na shemo JSON. Za izvedbo validacije uporabljamo omrežni validator sheme JSON knjižnica.
Razlog za uporabo te knjižnice je, da uporablja Jackson kot knjižnico JSON in podpira najnovejšo različico sheme JSON. Knjižnica networknt je a Java izvedba specifikacije JSON Schema Core Draft v4, v6, v7 in v2019-09 (ki jo uporabljamo v našem primeru) za validacijo sheme JSON. Ima Jacksona kot privzeti razčlenjevalnik JSON.
Najprej vzamemo primer dokumenta JSON in sheme JSON, ki ju uporabljamo v našem programu za izvajanje validacije.
Dokument JSON
{ 'name': 'Emma Watson', 'artist': 'Paul Walker', 'description': null, 'tags': ['oil', 'famous'] }
Shema 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'] } } }
V datoteko pom.xml dodamo naslednjo odvisnost.
com.networknt json-schema-validator 1.0.42
Uporabimo lahko tudi org.everit.json knjižnica za preverjanje objekta JSON. Če ga želimo uporabiti, moramo v datoteko pom.xml dodati naslednjo odvisnost:
org.everit.json org.everit.json.schema 1.11.1
V našem primeru uporabljamo networknt knjižnica Jave.
Za preverjanje dokumenta JSON uporabljamo naslednje korake:
- Ustvarite nov projekt maven.
- Dodajte odvisnost validatorja sheme JSON v našo datoteko pom.xml.
- Preberite podatke in shemo iz dokumenta JSON z uporabo ObjectMapper.
- Za preverjanje dokumenta JSON uporabite metodo validate() JsonSchemaFactory.
- Vrnjeni rezultat shranite v niz za preverjanje in ga natisnite na zaslon.
Zdaj je vse nastavljeno, tako da lahko implementiramo dejansko kodo za preverjanje dokumenta 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())); } } } }
Opis
V zgornji kodi uporabljamo VersionFlag . Za pridobitev JsonSchemaFactory , je potrebno posredovati to zastavico različice v konstruktorju. V našem primeru uporabljamo 2019-09 različico sheme JSON.
Uporabljamo tudi pomožno metodo po meri, tj. inputStreamFromClasspath(), da naložimo obe datoteki iz poti razreda. Ustvarimo primerek razreda Jackson ObjectMapper za branje podatkov JSON iz InputStream. Po tem te podatke InputStream razčlenimo v objekt JsonNode. Z uporabo primerka JsonSchemaFactory pridobimo objekt JsonSchema za preverjanje JsonNode. Ustvarimo nabor napak pri preverjanju, ki vsebuje enega ali več objektov ValidationMessage. Potrditveni nabor bo prazen, če ne bo nobene napake pri preverjanju.
Izhod