mer 18 ottobre 2017 - Lo Sviluppatore  anno III

Standard Java API per JSON

Condividi

 

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

JSR 353 (JSON Processing) API 1.0-SNAPSHOT AP

Standard Java API for JSON

Lascia un commento

Top