In Java speelt JSON, dat wil zeggen JavaScript Object Notation, een zeer belangrijke rol bij het manipuleren van de respons aan de serverzijde. In Java kunnen we JSON-documenten valideren aan de hand van een JSON-schema. Om de validatie uit te voeren, gebruiken we de networknt JSON Schema-validator bibliotheek.
De reden voor het gebruik van deze bibliotheek is dat deze Jackson als JSON-bibliotheek gebruikt en de nieuwste JSON Schema-versie ondersteunt. De netwerknt-bibliotheek is een Java implementatie van de JSON Schema Core Draft v4, v6, v7 en v2019-09 (die we in ons voorbeeld gebruiken) voor JSON-schemavalidatie. Het heeft Jackson als standaard JSON-parser.
Eerst nemen we een voorbeeld van een JSON-document en JSON-schema, die we in ons programma gebruiken om validatie uit te voeren.
JSON-document
{ 'name': 'Emma Watson', 'artist': 'Paul Walker', 'description': null, 'tags': ['oil', 'famous'] }
JSON-schema
{ '$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'] } } }
We voegen de volgende afhankelijkheid toe aan ons pom.xml-bestand.
com.networknt json-schema-validator 1.0.42
Wij kunnen ook gebruik maken van de org.everit.json bibliotheek voor het valideren van het JSON-object. Om het te gebruiken, moeten we de volgende afhankelijkheid toevoegen aan ons pom.xml-bestand:
org.everit.json org.everit.json.schema 1.11.1
In ons geval gebruiken we de netwerknt bibliotheek van Java.
We gebruiken de volgende stappen om het JSON-document te valideren:
- Maak een nieuw maven-project.
- Voeg de afhankelijkheid van de JSON-schemavalidator toe aan ons pom.xml-bestand.
- Lees de gegevens en het schema uit het JSON-document met ObjectMapper.
- Gebruik de methode validate() van JsonSchemaFactory om het JSON-document te valideren.
- Sla het geretourneerde resultaat op in de validatieset en print het op het scherm.
Alles is nu ingesteld, zodat we de daadwerkelijke code voor het valideren van het JSON-document kunnen implementeren.
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())); } } } }
Beschrijving
In de bovenstaande code gebruiken we de VersieVlag . Voor het verkrijgen van de JsonSchemaFactory , is het vereist om die versievlag door te geven in de constructor. In ons geval gebruiken we de 2019-09 versie van JSON-schema.
We gebruiken ook een aangepaste helpermethode, dat wil zeggen inputStreamFromClasspath(), om beide bestanden uit het klassenpad te laden. We maken een exemplaar van de Jackson ObjectMapper-klasse om de JSON-gegevens uit de InputStream te lezen. Daarna parseren we die InputStream-gegevens in een JsonNode-object. Met behulp van de instantie van de JsonSchemaFactory verkrijgen we het JsonSchema-object om de JsonNode te valideren. We maken een set validatiefouten die een of meer ValidationMessage-objecten bevat. De validatieset is leeg als er geen validatiefout is.
Uitvoer