Accueil Nos publications Blog Devoxx 2012 – JSR 353 : Java API for JSON Processing

Devoxx 2012 – JSR 353 : Java API for JSON Processing

Java EE 7 s’oriente un peu plus vers le web avec l’arrivée des websockets (JSR 356) et de l’API JSON (JSR 353).

Ces deux JSRs ont été présentées à Devoxx par Jitendra Kotamraju, leader sur les spécifications de JAX-WS 2.2 et de l’API Json. Il a également travaillé sur l’implémentation de différentes technologies web tel que SSE (Service Sent Events) et les Websockets dans Glassfish.

Petit retour sur sa présentation de l’API JSON et de ce qu’elle pourra nous apporter.

Java API for JSON Processing

Tout d’abord, petit rappel sur le format JSON : il décrit des données de manière textuelle et lisible par le commun des mortels. De plus, la structure des messages est plus légère et plus simple que ce que l’on peut avoir via du XML.

L’API JSON se découpe en deux sous API : une de flux (streaming) et une orientée objet (Object Model).

  Streaming Object Model
Consommation JsonParser JsonReader
Production JsonGenerator JsonWriter / JsonBuilder

Api Streaming :

JsonParser permet de parcourir un document JSON à partir d’évènements (début d’un objet, lecture d’un champ, d’une valeur, etc), un petit peu à la manière d’un parseur SAX.



    // JsonParser est un iterable d'Event
    JsonParser parser = Json.createParser(new StringReader(json));

    

JsonGenerator va vous aider à produire du JSON dans un flux via un Writer (StringWriter, OutputStreamWriter, …) et d’obtenir votre JSON au fur et à mesure de sa construction.



    JsonGenerator generator = Json.createGenerator(new OutputStreamWriter(System.out));

    generator.beginObject()
        .add("first name", "John")
        .add("last name", "Doe")
    .endObject().close();

    

Api Object Model

JsonReader va fournir la possibilité de lire du JSON à partir de primitives simples : readObject(), readArray() ou read() (qui permet de récupérer le JSON sous forme d’objet complet). Ensuite, il faut utiliser les méthodes associées aux types pour parcourir les structures.

Dans l’ensemble, on va manipuler des JsonObject, JsonArray, et des objets primaires type JsonNumber, JsonString, etc



    String json = "{\"first name\":\"john\", \"last name\": \"doe\"}";

    JsonReader reader = new JsonReader(new StringReader(json));

    String firstName = reader.readObject()
        .getValue("first name", JsonString.class)
        .getValue();
    

La production de JSON se fait via JsonBuilder pour créer une structure objet du JSON, et JsonWriter pour écrire la structure dans un Writer.



    JsonObject json = new JsonBuilder().beginObject()
                          .add("first name", "John")
                          .add("last name", "Doe")
                      .endObject().build();

    StringWriter writer = new StringWriter();
    JsonWriter jsonWriter = new JsonWriter(writer);
    jsonWriter.write(json);

    

Apport de la JSR

Via cette JSR, il va être possible de lire et écrire du JSON dans un environnement Java EE 7, sans avoir besoin d’utiliser une bibliothèque tierce. C’est toujours ça de moins à embarquer dans les EAR et autres WAR.

Par contre, la JSR n’offre pas la possibilité de binder du JSON en objet (et vice versa), comme genson, gson ou jackson. Ce sera pour une prochaine JSR. Et si JSON est utilisé massivement dans une application, l’API seule sera surement un peu légère.

Peut-être que des serveurs d’applications se baseront sur cette JSR pour gérer des fichiers de configuration en JSON, ce qui éviterait d’avoir des fichiers de configuration XML inutilement complexes par leur verbosité.

C’est pour quand ?

Tout cela sera dans la version 7 de Java EE, qui elle, devrait arriver en début d’année 2013. Si vous êtes pressés, vous pouvez récupérer l’implémentation via json-p.

L’API de référence utilisée est celle de glassfish, vous pouvez aussi utiliser cette dernière en ajoutant la dépendance maven ci-dessous :



    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.json</artifactId>
        <version>1.0-b01</version>
    </dependency>