Le Tutoriel de Java JSON Processing API (JSONP)
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.
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: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:
- "id": 111
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:
Tutoriels Java Open Source Libraries
- Le Tutoriel de Java JSON Processing API (JSONP)
- Utilisation de l'API Java Scribe OAuth avec Google OAuth2
- Obtenir des informations sur le matériel dans l'application Java
- Restfb Java API pour Facebook
- Créer Credentials pour Google Drive API
- Le Tutoriel de Java JDOM2
- Le Tutoriel de Java XStream
- Utiliser Java Jsoup pour analyser HTML
- Récupérer des informations géographiques basées sur l'adresse IP à l'aide de GeoIP2 Java API
- Lire et écrire un fichier Excel en Java à l'aide d'Apache POI
- Explorer le Facebook Graph API
- Manipulation de fichiers et de dossiers sur Google Drive à l'aide de Java
Show More