Em Java, JSON, ou seja, JavaScript Object Notation, desempenha um papel muito importante na manipulação da resposta do lado do servidor. Em Java, podemos validar documentos JSON em um esquema JSON. Para realizar a validação, utilizamos o validador de esquema JSON de rede biblioteca.
A razão para usar esta biblioteca é que ela usa Jackson como uma biblioteca JSON e oferece suporte à versão mais recente do esquema JSON. A biblioteca networknt é um Java implementação da especificação JSON Schema Core Draft v4, v6, v7 e v2019-09 (que usamos em nosso exemplo) para validação de esquema JSON. Possui Jackson como analisador JSON padrão.
Primeiro, pegamos um exemplo de documento JSON e esquema JSON, que usamos em nosso programa para realizar a validação.
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'] } } }
Adicionamos a seguinte dependência em nosso arquivo pom.xml.
com.networknt json-schema-validator 1.0.42
Também podemos usar o org.everit.json biblioteca para validar o objeto JSON. Para usá-lo, precisamos adicionar a seguinte dependência em nosso arquivo pom.xml:
org.everit.json org.everit.json.schema 1.11.1
No nosso caso, usamos o rede biblioteca de Java.
Usamos as seguintes etapas para validar o documento JSON:
- Crie um novo projeto maven.
- Adicione a dependência do validador de esquema JSON em nosso arquivo pom.xml.
- Leia os dados e o esquema do documento JSON usando ObjectMapper.
- Use o método activate() do JsonSchemaFactory para validar o documento JSON.
- Armazene o resultado retornado no conjunto de validação e imprima-o na tela.
Tudo está configurado agora, para que possamos implementar o código real de validação do 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())); } } } }
Descrição
No código acima, usamos o VersãoFlag . Para obter o JsonSchemaFactory , é necessário passar esse sinalizador de versão no construtor. No nosso caso, usamos o 2019-09 versão do esquema JSON.
Também usamos um método auxiliar personalizado, ou seja, inputStreamFromClasspath(), para carregar ambos os arquivos do caminho de classe. Criamos uma instância da classe Jackson ObjectMapper para ler os dados JSON do InputStream. Depois disso, analisamos os dados InputStream em um objeto JsonNode. Utilizando a instância do JsonSchemaFactory, obtemos o objeto JsonSchema para validar o JsonNode. Criamos um conjunto de erros de validação que contém um ou mais objetos ValidationMessage. O conjunto de validação estará vazio quando não houver erro de validação.
Saída