logo

JSON-validator Java

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:

  1. Maak een nieuw maven-project.
  2. Voeg de afhankelijkheid van de JSON-schemavalidator toe aan ons pom.xml-bestand.
  3. Lees de gegevens en het schema uit het JSON-document met ObjectMapper.
  4. Gebruik de methode validate() van JsonSchemaFactory om het JSON-document te valideren.
  5. 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

JSON-validator Java