En Java, JSON, es decir, la notación de objetos JavaScript, juega un papel muy importante en la manipulación de la respuesta del lado del servidor. En Java, podemos validar documentos JSON con un esquema JSON. Para realizar la validación utilizamos el validador de esquema JSON networknt biblioteca.
El motivo para utilizar esta biblioteca es que utiliza Jackson como biblioteca JSON y es compatible con la última versión del esquema JSON. La biblioteca networknt es una Java Implementación de la especificación JSON Schema Core Draft v4, v6, v7 y v2019-09 (que usamos en nuestro ejemplo) para la validación del esquema JSON. Tiene a Jackson como analizador JSON predeterminado.
Primero, tomamos un ejemplo de documento JSON y esquema JSON, que usamos en nuestro programa para realizar la validación.
Documento 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'] } } }
Agregamos la siguiente dependencia en nuestro archivo pom.xml.
com.networknt json-schema-validator 1.0.42
También podemos utilizar el org.everit.json biblioteca para validar el objeto JSON. Para usarlo, necesitamos agregar la siguiente dependencia en nuestro archivo pom.xml:
org.everit.json org.everit.json.schema 1.11.1
En nuestro caso utilizamos el red biblioteca de Java.
Utilizamos los siguientes pasos para validar el documento JSON:
- Crea un nuevo proyecto maven.
- Agregue la dependencia del validador de esquema JSON en nuestro archivo pom.xml.
- Lea los datos y el esquema del documento JSON utilizando ObjectMapper.
- Utilice el método validar() de JsonSchemaFactory para validar el documento JSON.
- Guarde el resultado devuelto en el conjunto de validación, imprímalo en la pantalla.
Todo está configurado ahora, por lo que podemos implementar el código real para validar el documento 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ón
En el código anterior, utilizamos el Bandera de versión . Para obtener el JsonSchemaFactory , es necesario pasar ese indicador de versión en el constructor. En nuestro caso utilizamos el 2019-09 versión del esquema JSON.
También utilizamos un método auxiliar personalizado, es decir, inputStreamFromClasspath(), para cargar ambos archivos desde el classpath. Creamos una instancia de la clase Jackson ObjectMapper para leer los datos JSON del InputStream. Después de eso, analizamos los datos de InputStream en un objeto JsonNode. Usando la instancia de JsonSchemaFactory obtenemos el objeto JsonSchema para validar el JsonNode. Creamos un conjunto de errores de validación que contiene uno o más objetos ValidationMessage. El conjunto de validación estará vacío cuando no haya ningún error de validación.
Producción