Jackson Streaming API

Jackson Streaming API

Si vous avez quelques années d'expérience dans l'écosystème Java et que vous souhaitez partager cette expérience avec la communauté (et être payé pour votre travail bien sûr), jetez un œil aux"Write for Us" page. À votre santé. Eugen

1. Overview

Dans cet article, nous allons examiner l'API Jackson Streaming. Il prend en charge à la fois la lecture et l'écriture et, en l'utilisant, nous pouvons écrire des analyseurs syntaxiques JSON hautes performances et rapides.

D'un autre côté, il est un peu difficile à utiliser - chaque détail des données JSON doit être traité explicitement dans le code.

2. Dépendance Maven

Tout d'abord, nous devons ajouter une dépendance Maven auxjackson-core:


    com.fasterxml.jackson.core
    jackson-core
    2.9.4

3. Écrire en JSON

Nous pouvons écrire du contenu JSON directement dans lesOutputStream en utilisant une classeJsonGenerator. Tout d'abord, nous devons créer l'instance de cet objet:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
JsonFactory jfactory = new JsonFactory();
JsonGenerator jGenerator = jfactory
  .createGenerator(stream, JsonEncoding.UTF8);

Ensuite, disons que nous voulons écrire un JSON avec la structure suivante:

{
   "name":"Tom",
   "age":25,
   "address":[
      "Poland",
      "5th avenue"
   ]
}

Nous pouvons utiliser une instance desJsonGenerator pour écrire des champs spécifiques directement dans lesOutputStream:

jGenerator.writeStartObject();
jGenerator.writeStringField("name", "Tom");
jGenerator.writeNumberField("age", 25);
jGenerator.writeFieldName("address");
jGenerator.writeStartArray();
jGenerator.writeString("Poland");
jGenerator.writeString("5th avenue");
jGenerator.writeEndArray();
jGenerator.writeEndObject();
jGenerator.close();

Pour vérifier si le JSON approprié a été créé, nous pouvons créer un objetString avec un objet JSON:

String json = new String(stream.toByteArray(), "UTF-8");
assertEquals(
  json,
  "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}");

4. Analyse JSON

Lorsque nous obtenons un JSONString en entrée et que nous voulons en extraire des champs spécifiques, une classeJsonParser peut être utilisée:

String json
  = "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}";
JsonFactory jfactory = new JsonFactory();
JsonParser jParser = jfactory.createParser(json);

String parsedName = null;
Integer parsedAge = null;
List addresses = new LinkedList<>();

Nous voulons obtenir les champsparsedName, parsedAge, and addresses à partir de l'entrée JSON. Pour ce faire, nous devons gérer la logique d'analyse de bas niveau et la mettre en œuvre nous-mêmes:

while (jParser.nextToken() != JsonToken.END_OBJECT) {
    String fieldname = jParser.getCurrentName();
    if ("name".equals(fieldname)) {
        jParser.nextToken();
        parsedName = jParser.getText();
    }

    if ("age".equals(fieldname)) {
        jParser.nextToken();
        parsedAge = jParser.getIntValue();
    }

    if ("address".equals(fieldname)) {
        jParser.nextToken();
        while (jParser.nextToken() != JsonToken.END_ARRAY) {
            addresses.add(jParser.getText());
        }
    }
}
jParser.close();

En fonction du nom du champ, nous l’extrayons et l’affectons à un champ approprié. Après l'analyse du document, tous les champs doivent avoir les données correctes:

assertEquals(parsedName, "Tom");
assertEquals(parsedAge, (Integer) 25);
assertEquals(addresses, Arrays.asList("Poland", "5th avenue"));

5. Extraction de pièces JSON

Parfois, lorsque nous analysons un document JSON, nous ne nous intéressons qu’à un champ particulier.

Idéalement, dans ces situations, nous souhaitons uniquement analyser le début du document et, une fois que le champ requis est trouvé, nous pouvons abandonner le traitement.

Disons que nous ne nous intéressons qu'au champage du JSON d'entrée. Dans ce cas, nous pouvons implémenter une logique d'analyse pour arrêter l'analyse une fois que le champ nécessaire est trouvé:

while (jParser.nextToken() != JsonToken.END_OBJECT) {
    String fieldname = jParser.getCurrentName();

    if ("age".equals(fieldname)) {
        jParser.nextToken();
        parsedAge = jParser.getIntValue();
        return;
    }

}
jParser.close();

Après traitement, le seul champparsedAge aura une valeur:

assertNull(parsedName);
assertEquals(parsedAge, (Integer) 25);
assertTrue(addresses.isEmpty());

Grâce à cela, l'analyse du document JSON sera beaucoup plus rapide car nous n'avons pas besoin de lire le document en entier, mais seulement une petite partie de celui-ci.

6. Conclusion

Dans cet article rapide, nous examinons comment nous pouvons tirer parti de l'API Stream Processing de Jackson.

L'implémentation de tous ces exemples et extraits de code peut être trouvéeover on GitHub - c'est un projet Maven, il devrait donc être facile à importer et à exécuter tel quel.