devstory

Le Tutoriel de Java JSON Processing API (JSONP)

  1. Qu'est-ce que JSON?
  2. Des bibliothèque pour analyser Json
  3. Json Processing API
  4. Create Maven Project
  5. La vue ensemble de JSON-P
  6. Exemple avec JSON-P
  7. Exemple avec JsonWriter
  8. Exemple avec JsonParser

1. Qu'est-ce que JSON?

JSON (JavaScript Object Notation) es un texte de données structurées, ses éléments sont une paire des clés et des valeurs, ses valeurs peuvent être également un autre élément (clé & valeur), parfois les valeurs peuvent être une gamme.
C'est une structure de données JSON:
{
"name" : "Tran",
"address" : "Hai Duong, Vietnam",
"phones" : [0121111111, 012222222]
}
Exemple avec des paires de valeurs clefs imbriquées:
{
 "id": 111 ,
 "name":"Microsoft",
 "websites": [
    "http://microsoft.com",
    "http://msn.com",
    "http://hotmail.com"
 ],
 "address": {
    "street":"1 Microsoft Way",
    "city":"Redmond"
 }
}

2. Des bibliothèque pour analyser Json

il y a plusieurs bibliothèques de source ouverte Java vous aide à analyser les données Json. Ci-dessous est une liste de telles bibliothèques:
  • json.org
  • Jackson
  • Google GSON
  • json-lib
  • javax json
  • json-simple
  • json-smart
  • flexjson
  • fastjson

3. Json Processing API

JSON Processing (JSR-353) API est introduit dans la spécification de Java EE 7, cela signifie que ses bibliothèques sont disponibles sur le Serveur Web compatible avec Java EE 7. Vous pouvez égalment télécharger ces bibliothèques ou utiliser Maven.
Avec Maven:
<!-- http://mvnrepository.com/artifact/org.glassfish/javax.json -->
<dependency>
   <groupId>org.glassfish</groupId>
   <artifactId>javax.json</artifactId>
   <version>1.0.4</version>
</dependency>
JSON-P est divisé en deux noyaux API:
  • API Streaming (javax.json.stream),
  • JSON API Object Model (javax.json).
Streaming API est utilisé pour analyser le navigateur le document JSON de haut en bas, et émettre des événements quand il analyse chaque élément du document. Ce API convient à l'analyse des documents JSON de grande taille, parce qu'il ne stocke pas de données sur le mémoire.

Les API Object Model, est simple et facile à utiliser API, parce qu'il utilise API Streaming afin de lire l'entier document JSON et il génère des objets dans l'aborescence de la mémoire. Ce API convient de l'analyse des documents JSON de petite taille.

4. Create Maven Project

Vous pouvez créer rapidement un projet Maven et déclarer l'utilisation de la bibliothèque JSON-P
La bibliothèque maven:
<!-- http://mvnrepository.com/artifact/org.glassfish/javax.json -->
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.0.4</version>
</dependency>
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 http://maven.apache.org/xsd/maven-4.0.0.xsd">

 <modelVersion>4.0.0</modelVersion>

 <groupId>org.o7planning</groupId>
 <artifactId>JSONPTutorial</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>JSONPTutorial</name>
 <url>http://maven.apache.org</url>

 <properties>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

 <dependencies>


   <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>3.8.1</version>
     <scope>test</scope>
   </dependency>
   
   <!-- http://mvnrepository.com/artifact/org.glassfish/javax.json -->
   <dependency>
       <groupId>org.glassfish</groupId>
       <artifactId>javax.json</artifactId>
       <version>1.0.4</version>
   </dependency>
   
   
 </dependencies>

</project>

5. La vue ensemble de JSON-P

Quelques Interfaces importantes de JSON API sont:
Interface
Description
javax.json.JsonReader
Vous pouvez l'utiliser pour lire l'objet JSON ou un tableau dans JsonObject. Et obtenez JsonReader de la classe Json ou JsonReaderFactory.
javax.json.JsonWriter
Vous pouvez l'utiliser pour écrire l'objet JSON dans le flux de sortie. (Output Stream).
javax.json.stream.JsonParser
Cela fonctionne comme un analyseur complet et fournit un support de diffusion (stream) pour la lecture des objets JSON.
javax.json.stream.JsonGenerator
Vous pouvez l'utiliser pour écrire l'objet JSON sur la source de sortie en mode de diffusion en flux. (Output Stream).
javax.json.Json
C'est la classe d'usine pour créer des objets de traitement JSON. Cette classe fournit les méthodes les plus couramment utilisées pour créer ces objets et leurs usines correspondantes. Les classes d'usine fournissent toutes les différentes façons de créer ces objets.

6. Exemple avec JSON-P

Ici est un fichier de données JSON:
company.txt
{
  "id": 111 ,
  "name":"Microsoft",
  "websites": [
     "http://microsoft.com",
     "http://msn.com",
     "http://hotmail.com"
  ],
  "address":{
     "street":"1 Microsoft Way",
     "city":"Redmond"
  }
}
Remarque: Le nom de l'attribut (attribute) doit être mis dans "" (entre guillements), par exemple:
  • "id": 111
Parfois, les attributs de des données JSON ne se trouvent pas entre guillements, quelques analysateur de JSON le comprennent et le permettent, mais l'analysateur JSON-P ne le permet pas, si vous utilisez Java JSON-P pour analyser une données JSON dont le nom de l'attibut n'est pas trouvé entre guillements, vous recevrez une exception:
javax.json.stream.JsonParsingException: Unexpected char 105 at (line no=xx, column no=xx, offset=xx)
Address.java
package org.o7planning.jsonptutorial.beans;

public class Address {
   
   private String street;
   private String city;

   public Address() {

   }

   public Address(String street, String city) {
       this.street = street;
       this.city = city;
   }

   public String getStreet() {
       return street;
   }

   public void setStreet(String street) {
       this.street = street;
   }

   public String getCity() {
       return city;
   }

   public void setCity(String city) {
       this.city = city;
   }

   @Override
   public String toString() {
       return street + ", " + city;
   }
   
}
Company.java
package org.o7planning.jsonptutorial.beans;

public class Company {

   private int id;
   private String name;
   private String[] websites;
   private Address address;

   public int getId() {
       return id;
   }

   public void setId(int id) {
       this.id = id;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String[] getWebsites() {
       return websites;
   }

   public void setWebsites(String[] websites) {
       this.websites = websites;
   }

   public Address getAddress() {
       return address;
   }

   public void setAddress(Address address) {
       this.address = address;
   }

   @Override
   public String toString() {
       StringBuilder sb = new StringBuilder();

       sb.append("\n id:" + this.id);
       sb.append("\n name:" + this.name);
       if (this.websites != null) {
           sb.append("\n website: ");
           for (String website : this.websites) {
               sb.append(website + ", ");
           }
       }
       if (this.address != null) {
           sb.append("\n address:" + this.address.toString());
       }
       return sb.toString();
   }

}
JsonReader est un objet utilsé pour lire la données JSON, vous pouvez prendre l'objet JsonReader de la classe Json ou de JsonReaderFactory.
InputStream input = new FileInputStream("company.txt");
 
// Create JsonReader object from Json class.
JsonReader jsonReader1 = Json.createReader(input);

// Or from Factory
JsonReaderFactory factory = Json.createReaderFactory(null);
JsonReader jsonReader2 = factory.createReader(input);
JsonReaderExample.java
package org.o7planning.jsonptutorial;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.json.JsonValue;

import org.o7planning.jsonptutorial.beans.Address;
import org.o7planning.jsonptutorial.beans.Company;

public class JsonReaderExample {
 
  public static void main(String[] args) throws IOException {
      InputStream input = new FileInputStream("company.txt");
     
      // Create JsonReader object
      JsonReader jsonReader = Json.createReader(input);
   
     
      // Get JsonObject (root object).
      JsonObject rootJSON = jsonReader.readObject();
     
      // Close resources
      jsonReader.close();
      input.close();
     
      // Create empty Company object.
      Company company = new Company();
     
      company.setId(rootJSON.getInt("id"));
      company.setName(rootJSON.getString("name"));
     
     
      // Reading websites array from json
      JsonArray jsonArray = rootJSON.getJsonArray("websites");
      String[] websites = new String[jsonArray.size()];
     
      int index = 0;
      for(JsonValue value : jsonArray){
          websites[index++] = value.toString() ;
      }
      company.setWebsites(websites);
     
      // Reading inner object from json object.
      JsonObject addressJSON = rootJSON.getJsonObject("address");
      Address address = new Address();
      address.setStreet(addressJSON.getString("street"));
      address.setCity(addressJSON.getString("city"));
   
      company.setAddress(address);
     
      // Print out information
      System.out.println(company);
     
  }

}
Exécutez l'exemple:

7. Exemple avec JsonWriter

JsonWriterExample.java
package org.o7planning.jsonptutorial;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;

import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonWriter;

import org.o7planning.jsonptutorial.beans.Address;
import org.o7planning.jsonptutorial.beans.Company;

public class JsonWriterExample {

  public static void main(String[] args) throws FileNotFoundException {

      Company company = createCompany();

      // Object Builder
      JsonObjectBuilder companyBuilder = Json.createObjectBuilder();
     
      // Object Builder
      JsonObjectBuilder addressBuilder = Json.createObjectBuilder();
     
      // Array Builder
      JsonArrayBuilder websitesBuilder = Json.createArrayBuilder();

      for (String website : company.getWebsites()) {
          websitesBuilder.add(website);
      }

      Address address = company.getAddress();
      addressBuilder.add("street", address.getStreet()).add("city", address.getCity() );

      companyBuilder.add("id", company.getId()).add("name", company.getName() );

      companyBuilder.add("websites", websitesBuilder);
      companyBuilder.add("address", addressBuilder);

      // Root JsonObject
      JsonObject rootJSONObject = companyBuilder.build();

      System.out.println("Root JsonObject: " + rootJSONObject);

      // Write to file
      File outFile= new File("C:/test/company2.txt");
      outFile.getParentFile().mkdirs();
     
      OutputStream os = new FileOutputStream(outFile);
      JsonWriter jsonWriter = Json.createWriter(os);
     
      jsonWriter.writeObject(rootJSONObject);
      jsonWriter.close();
  }

  public static Company createCompany() {

      Company company = new Company();
      company.setId(123);
      company.setName("Apple");

      String[] websites = { "http://apple.com"};
      company.setWebsites(websites);

      Address address = new Address();
      address.setCity("Cupertino");
      address.setStreet("1 Infinite Loop");

      company.setAddress(address);

      return company;
  }
 
}
Run the example:

8. Exemple avec JsonParser

Ci-dessus vous avez travaillé avec JsonReader pour lire de contenu du fichier json, dont le contenu de Json est des objets et est stockés usr le mémoire, cette façon convient seulement quand vous travaillez avec des données Json de petite taille. Au cas où des données de grande taille, utilisez JsonParser pour analyser des données de Json. JsonParser fonctionne comme la manière de l'analyse de XML appartenant de SAX. JsonParser ne stocke pas des données sur le mémoire.
Sur votre code, il appelle la méthode next() pour que JsonParser analyse le prochain élément de Json, il génère des événements après de l'analyse d'un élément. Cet analysateur peut générer des événements ci- dessous:
  • START_OBJECT
  • END_OBJECT
  • START_ARRAY
  • END_ARRAY
  • KEY_NAME
  • VALUE_STRING
  • VALUE_NUMBER
  • VALUE_TRUE
  • VALUE_FALSE
  • VALUE_NULL.
Basé sur le nom de l'événement émis, et le nom de l'événement analysé, vous pouvez connaître la position analysée et récupérer ces valeurs là- bas.
Des méthodes qui peuvent être utilisées dans ce cas:
  • getString()
  • getInt()
  • ....
Observez l'exemple:
JsonParserExample.java
package org.o7planning.jsonptutorial;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.json.Json;
import javax.json.stream.JsonParser;

import org.o7planning.jsonptutorial.beans.Address;
import org.o7planning.jsonptutorial.beans.Company;

public class JsonParserExample {

    public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("company.txt");

        JsonParser jsonParser = Json.createParser(inputStream);


        // Create objects, their fields will be assigned values
        // each time the value is found in the events.
        Company company = new Company();
        Address address = new Address();
        
        List<String> websitesList = new ArrayList<String>();

        // Key name of JSON
        String keyName = null;
        
        while (jsonParser.hasNext()) {
            JsonParser.Event event = jsonParser.next();
            switch (event) {
            case KEY_NAME:
                keyName = jsonParser.getString();
                break;
            case VALUE_STRING:
                setStringValues(company, address, keyName, jsonParser.getString(), websitesList);
                break;
            case VALUE_NUMBER:
                setNumberValues(company, address, keyName, jsonParser.getInt());
                break;
            default:
                // No need..
            }
        }
        company.setAddress(address);
        String[] websites = new String[websitesList.size()];
        websitesList.toArray(websites);
        company.setWebsites(websites);

        // Print out
        System.out.println(company);        
        inputStream.close();
        jsonParser.close();
    }

    private static void setNumberValues(Company company, Address address, String keyName, int value) {
        if (keyName.equals("id")) {
            company.setId(value);
        } else {
            System.out.println("Unknown Key:" + keyName);
        }
    }

    private static void setStringValues(Company company, Address address, String keyName, String value,
            List<String> websiteList) {
        if (keyName.equals("name")) {
            company.setName(value);
        } else if (keyName.equals("street")) {
            address.setStreet(value);
        } else if (keyName.equals("city")) {
            address.setCity(value);
        } else if (keyName.equals("websites")) {
            websiteList.add(value);
        } else {
            System.out.println("Unknown Key=" + keyName);
        }
    }

}
Exécutez l'exemple: