Introdução ao esquema JSON em Java

Introdução ao esquema JSON em Java

1. Visão geral

JSON Schema é uma linguagem declarativa para validar o formato e a estrutura de umJSON Object. Ele nos permite especificar o número de primitivas especiais para descrever exatamente como será umJSON Object válido.

A especificaçãoJSON Schema é dividida em três partes:

  • JSON Schema Core: a especificação JSON Schema Core é onde a terminologia para um esquema é definida.

  • JSON Schema Validation: a especificação JSON Schema Validation é o documento que define as formas válidas para definir as restrições de validação. Este documento também define um conjunto de palavras-chave que podem ser usadas para especificar validações para uma API JSON. Nos exemplos a seguir, usaremos algumas dessas palavras-chave.

  • JSON Hyper-Schema: Esta é outra extensão da especificação do Esquema JSON, em que o hiperlink e as palavras-chave relacionadas à hipermídia são definidas.

2. Definindo um esquema JSON

Agora que definimos para que serve umJSON Schema, vamos criar umJSON Objecte oJSON Schema correspondente que o descreve.

O que se segue é umJSON Object simples que representa um catálogo de produtos:

{
    "id": 1,
    "name": "Lampshade",
    "price": 0
}

Podemos definir seuJSON Schema da seguinte maneira:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "Product",
    "description": "A product from the catalog",
    "type": "object",
    "properties": {
        "id": {
            "description": "The unique identifier for a product",
            "type": "integer"
        },
        "name": {
            "description": "Name of the product",
            "type": "string"
        },
        "price": {
            "type": "number",
            "minimum": 0,
            "exclusiveMinimum": true
        }
    },
    "required": ["id", "name", "price"]
}

Como podemos ver,JSON Schema éJSON document, e esse documento DEVE ser um objeto. Os membros (ou propriedades) do objeto definidos porJSON Schema são chamadoskeywords.

Vamos explicar as palavras-chave que usamos em nosso exemplo:

  • A palavra-chave$schema afirma que este esquema foi escrito de acordo com a especificação do rascunho v4.

  • As palavras-chavetitleedescription são apenas descritivas, pois não adicionam restrições aos dados que estão sendo validados. A intenção do esquema é declarada com essas duas palavras-chave: descreve um produto.

  • A palavra-chavetypedefines the first constraint em nossos dadosJSON: ithas to be aJSON Object.

Além disso, um esquema JSON PODE conter propriedades que não são palavras-chave do esquema. Em nosso casoid,name,price serão membros (ou propriedades) deJSON Object.

Para cada propriedade, podemos definir otype. Definimosid ename comostring eprice comonumber. EmJSON Schema, um número pode ter um mínimo. Por padrão, esse mínimo é inclusivo, portanto, precisamos especificarexclusiveMinimum.

Finalmente, oSchema informa queid,name eprice sãorequired.

3. Validação com esquema JSON

Com nossoJSON Schema, coloquewe can validate nossoJSON Object.

Existem muitoslibraries para realizar esta tarefa. Para nosso exemplo, escolhemos a biblioteca Javajson-schema.

Primeiro de tudo, precisamos adicionar a seguinte dependência ao nossopom.xml:


    org.everit.json
    org.everit.json.schema
    1.3.0

Finalmente, podemos escrever alguns casos de teste simples para validar nossoJSON Object:

@Test
public void givenInvalidInput_whenValidating_thenInvalid() throws ValidationException {
    JSONObject jsonSchema = new JSONObject(
      new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/schema.json")));
    JSONObject jsonSubject = new JSONObject(
      new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/product_invalid.json")));

    Schema schema = SchemaLoader.load(jsonSchema);
    schema.validate(jsonSubject);
}

Neste caso, lançadoValidationException apontará para#/price. Se você olhar para o console, ele imprimirá a seguinte saída:

#/price: 0.0 is not higher than 0

O segundo teste é semelhante ao seguinte:

@Test
public void givenValidInput_whenValidating_thenValid() throws ValidationException {
    JSONObject jsonSchema = new JSONObject(
      new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/schema.json")));
    JSONObject jsonSubject = new JSONObject(
      new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/product_valid.json")));

    Schema schema = SchemaLoader.load(jsonSchema);
    schema.validate(jsonSubject);
}

Como usamos umJSON Object válido, nenhum erro de validação será gerado.

4. Conclusão

Neste artigo, definimos o que é um esquema JSON e quais são algumas das palavras-chavethat helps us relevantes para definir nosso esquema.

[#result_box .short_text] #Coupling aJSON Schema com sua representaçãoJSON Object correspondente, podemos realizar algumas tarefas de validação. #

Um caso de teste simples deste artigo pode ser encontrado emGitHub project.