logo

Java validador JSON

A Java, JSON, és a dir, JavaScript Object Notation, té un paper molt important en la manipulació de la resposta del servidor. A Java, podem validar documents JSON amb un esquema JSON. Per realitzar la validació, fem servir el validador d'esquemes JSON networknt biblioteca.

El motiu d'utilitzar aquesta biblioteca és que utilitza Jackson com a biblioteca JSON i és compatible amb la darrera versió de l'esquema JSON. La biblioteca networknt és una Java implementació de l'especificació JSON Schema Core Draft v4, v6, v7 i v2019-09 (que fem servir al nostre exemple) per a la validació d'esquemes JSON. Té Jackson com a analitzador JSON predeterminat.

Primer, prenem un exemple de document JSON i esquema JSON, que fem servir al nostre programa per realitzar la validació.

Document JSON

 { 'name': 'Emma Watson', 'artist': 'Paul Walker', 'description': null, 'tags': ['oil', 'famous'] } 

Esquema 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'] } } } 

Afegim la següent dependència al nostre fitxer pom.xml.

 com.networknt json-schema-validator 1.0.42 

També podem utilitzar el org.everit.json biblioteca per validar l'objecte JSON. Per utilitzar-lo, hem d'afegir la següent dependència al nostre fitxer pom.xml:

 org.everit.json org.everit.json.schema 1.11.1 

En el nostre cas, fem servir el networknt biblioteca de Java.

Utilitzem els passos següents per validar el document JSON:

  1. Crea un nou projecte maven.
  2. Afegiu la dependència del validador d'esquemes JSON al nostre fitxer pom.xml.
  3. Llegiu les dades i l'esquema del document JSON mitjançant ObjectMapper.
  4. Utilitzeu el mètode validate() de JsonSchemaFactory per validar el document JSON.
  5. Emmagatzemeu el resultat retornat al conjunt de validació, imprimiu-lo a la pantalla.

Ara està tot configurat, de manera que podem implementar el codi real de validació del document 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())); } } } } 

Descripció

En el codi anterior, fem servir el VersionFlag . Per obtenir el JsonSchemaFactory , cal passar aquest indicador de versió al constructor. En el nostre cas, fem servir el curs 2019-09 versió de l'esquema JSON.

També fem servir un mètode d'ajuda personalitzat, és a dir, inputStreamFromClasspath(), per carregar els dos fitxers des del classpath. Creem una instància de la classe Jackson ObjectMapper per llegir les dades JSON de l'InputStream. Després d'això, analitzem aquestes dades d'InputStream en un objecte JsonNode. Utilitzant la instància del JsonSchemaFactory, obtenim l'objecte JsonSchema per validar el JsonNode. Creem un conjunt d'errors de validació que conté un o més objectes ValidationMessage. El conjunt de validació estarà buit quan no hi hagi cap error de validació.

Sortida

Java validador JSON