La SR-353, l’API Java per JSON Processing (JSON-P), ha raggiunto da pochissimo tempo l’approvazione definitiva e farà parte della prossima Java EE 7. JSON-P (simile a JAXP) è costituito da una streaming API (simile a StAX) e un Object Model API (simile al DOM). L’implementazione di riferimento è jsonp, un progetto open source, attualmente in versione beta.
JSON (JavaScript Object Notation) è un formato leggero di interscambio dati, ed è utilizzato in applicazioni web, servizi REST e database NoSQL. Con la popolarità di JSON e l’arrivo di molte librerie JSON per la piattaforma Java (org.json, Jackson, google-gson, ecc), è nata la necessità di standardizzare il modo di come gli sviluppatori creano e consumano dati in formato JSON.
JSON-P è il futuro standard, e può essere usato sia in modalità standalone che all’interno di application server che supportano Java EE 7.
JSON-P è suddiviso in due API:
- la Streaming API (javax.json.stream), e
- l’Object Model API (javax.json).
La Streaming API
La Streaming API è la modalità di basso livello e quindi anche la più efficiente per analizzare e generare JSON. Si basa sulle Interfacce, JsonParser e JsonGenerator.
JsonParser è un parser di tipo pull che permette l’accesso in sola lettura di una sorgente di dati in formato JSON. In questo tipo di parser, basato sul pattern Iterator, è il programma client che chiede al parser il prossimo pezzo di informazione, piuttosto che il parser a notificare al programma client quando il prossimo dato è disponibile. JsonGenerator fornisce metodi per scrivere JSON in un flusso scrivendo coppie nome-valore in oggetti JSON e valori in array JSON. Sotto alcuni esempi di codice che utilizzano JsonParser e JsonGenerator:
Consideriamo il seguente flusso di un array di oggetti JSON:
<code class="language-javascript"> [ { "tipo" : "fisso", "numero" : "(02) 1111111" }, { "tipo" : "cell", "numero" : "(328) 2222222" } ] </code>
Vediamo come utilizzare il parser per leggere e analizzare questo flusso mostrandone l’output:
<code class="language-java"> JsonParserFactory factory = Json.createParserFactory(null); JsonParser parser = factory.createParser(new StringReader(json)); while (parser.hasNext()) { Event event = parser.next(); switch (event) { case KEY_NAME: { System.out.print(parser.getString() + "="); break; } case VALUE_STRING: { System.out.println(parser.getString()); break; } } } Output: tipo=fisso number=(02) 1111111 tipo=cell number=(328) 2222222 </code>
Ora vediamo un esempio di utilizzo del JsonGenerator, che genera l’array JSON preso in esempio e lo stampa su System.out :
<code class="language-java"> JsonGeneratorFactory factory = Json.createGeneratorFactory(null); JsonGenerator generator = factory.createGenerator(System.out); generator.writeStartArray(). writeStartObject(). write("tipo", "fisso"). write("numero", "(02) 1111111").writeEnd(). writeStartObject(). write("tipo", "cell"). write("numero", "(328) 2222222").writeEnd(). writeEnd().close() </code>
L’Object Model API
La Object Model API è una API più ad alto livello, simile alla DOM API for XML ed è implementata “sopra” la Streaming API. Mediante la Object Model API è possibile creare una struttura ad albero che rappresenta i dati JSON in memoria, che può essere facilmente navigabile e interrogabile. Le classi principali di questa API sono JsonObject e JsonArray, che sono entrambi classi immutabili.
JsonObject fornisce una vista del tipo Map per accedere al set non ordinato di coppie nome-valore. JsonArray fornisce una visualizzazione tipo List per accedere alla sequenza ordinata di valori. Per creare questi modelli di oggetti, è possibile utilizzare il pattern builder (JsonObjectBuilder e JsonArrayBuilder) o leggerli da una fonte di input (InputStream o Reader) utilizzando JsonReader. È inoltre possibile scrivere questi modelli a oggetti in uno stream di output (OutputStream o Writer) utilizzando il JsonWriter.
Ecco un esempio di creazione di un oggetto JsonArray che modella l’array JSON preso in esempio, utilizzando JsonArrayBuilder :
<code class="language-java"> JsonBuilderFactory factory = Json.createBuilderFactory(null); JsonArray jsonArray = factory.createArrayBuilder() .add(factory.createObjectBuilder(). add("tipo", "fisso"). add("numero", "(02) 1111111")) .add(factory.createObjectBuilder(). add("tipo", "cell"). add("numero", "(328) 2222222")).build(); </code>
Esempio di un utilizzo di JsonReader:
<code class="language-java"> try (JsonReader jsonReader = Json.createReader(new StringReader(json))) { JsonArray array = jsonReader.readArray(); System.out.println(array); } </code>
e infine un esempio di utilizzo di JsonWriter :
<code class="language-java"> try (JsonWriter jsonWriter = Json.createWriter(System.out)) { jsonWriter.writeArray(jsonArray); } </code>
Riferimenti