Introduction au schéma JSON en Java

Introduction au schéma JSON en Java

1. Vue d'ensemble

JSON Schema est un langage déclaratif pour valider le format et la structure d'unJSON Object. Cela nous permet de spécifier le nombre de primitives spéciales pour décrire exactement à quoi ressemblera unJSON Object valide.

La spécificationJSON Schema est divisée en trois parties:

  • JSON Schema Core: la spécification JSON Schema Core est l'endroit où la terminologie d'un schéma est définie.

  • JSON Schema Validation: la spécification de validation de schéma JSON est le document qui définit les méthodes valides pour définir les contraintes de validation. Ce document définit également un ensemble de mots-clés pouvant être utilisés pour spécifier des validations pour une API JSON. Dans les exemples qui suivent, nous utiliserons certains de ces mots clés.

  • JSON Hyper-Schema: il s'agit d'une autre extension de la spécification de schéma JSON, dans laquelle les mots-clés liés à l'hyperlien et à l'hypermédia sont définis.

2. Définition d'un schéma JSON

Maintenant que nous avons défini à quoi sert unJSON Schema, créons unJSON Object et lesJSON Schema correspondants le décrivant.

Voici un simpleJSON Object représentant un catalogue de produits:

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

Nous pourrions définir sesJSON Schema comme suit:

{
    "$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"]
}

Comme nous pouvons le voir, unJSON Schema est unJSON document, et ce document DOIT être un objet. Les membres d'objets (ou propriétés) définis parJSON Schema sont appeléskeywords.

Expliquons les mots clés que nous avons utilisés dans notre exemple:

  • Le mot clé$schema indique que ce schéma est écrit conformément à la spécification provisoire v4.

  • Les mots-cléstitle etdescription sont uniquement descriptifs, en ce sens qu'ils n'ajoutent pas de contraintes aux données en cours de validation. L'intention du schéma est indiquée avec ces deux mots clés: décrit un produit.

  • Le mot-clétypedefines the first constraint sur nos donnéesJSON: ithas to be aJSON Object.

De plus, un schéma JSON PEUT contenir des propriétés qui ne sont pas des mots-clés de schéma. Dans notre casid,name,price seront des membres (ou propriétés) desJSON Object.

Pour chaque propriété, nous pouvons définir lestype. Nous avons définiid etname commestring etprice commenumber. EnJSON Schema, un nombre peut avoir un minimum. Par défaut, ce minimum est inclusif, nous devons donc spécifierexclusiveMinimum.

Enfin, lesSchema indiquent queid,name etprice sontrequired.

3. Validation avec le schéma JSON

Avec nosJSON Schema mis en placewe can validate nosJSON Object.

Il existe de nombreuxlibraries pour accomplir cette tâche. Pour notre exemple, nous avons choisi la bibliothèque Javajson-schema.

Tout d'abord, nous devons ajouter la dépendance suivante à nospom.xml:


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

Enfin, nous pouvons écrire quelques cas de test simples pour valider nosJSON 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);
}

Dans ce cas, lesValidationException lancés pointeront vers#/price. Si vous regardez la console, elle affichera la sortie suivante:

#/price: 0.0 is not higher than 0

Le deuxième test ressemble à ce qui suit:

@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);
}

Puisque nous utilisons unJSON Object valide, aucune erreur de validation ne sera renvoyée.

4. Conclusion

Dans cet article, nous avons défini ce qu'est un schéma JSON et quels sont les mots clésthat helps us pertinents pour définir notre schéma.

[#result_box .short_text] #Couplant unJSON Schema avec sa représentationJSON Object correspondante, nous pouvons effectuer une tâche de validation. #

Un cas de test simple de cet article peut être trouvé dans lesGitHub project.