codestory

Die Anleitung zu Java JSON Processing API (JSONP)

  1. Was ist JSON ?
  2. Die Bibliothek zur Json-Analyse
  3. Json Processing API
  4. Create Maven Project
  5. Die Überblick von JSON-P
  6. Das Beispiel über JSON-P
  7. Das Beispiel mit JsonWriter
  8. Das Beispiel mit JsonParser

1. Was ist JSON ?

JSON (JavaScript Object Notation) ist ein Textdaten mit der Struktur, dessen Elemente ein Paar von Schlüssel und Wert ist. Seine Wert kann ein Element (Schlüssel und Wert) oder manchmal ein Array sein
Das ist eine Struktur der Daten JSON:
{
"name" : "Tran",
"address" : "Hai Duong, Vietnam",
"phones" : [0121111111, 012222222]
}
Zum Beispiel: Die geschachtelten Paare von Schlüssel und Wert
{
 "id": 111 ,
 "name":"Microsoft",
 "websites": [
    "http://microsoft.com",
    "http://msn.com",
    "http://hotmail.com"
 ],
 "address": {
    "street":"1 Microsoft Way",
    "city":"Redmond"
 }
}

2. Die Bibliothek zur Json-Analyse

Viele Java Open Source Code Bibliothek helfen Ihnen bei der Analyse der Daten Json. Unten ist die Liste dieser Bibliotheke:
  • json.org
  • Jackson
  • Google GSON
  • json-lib
  • javax json
  • json-simple
  • json-smart
  • flexjson
  • fastjson

3. Json Processing API

JSON Processing (JSR-353) API wird in der Eigenschaftsüberblick von Java EE 7 eingeführt. D.h seine Bibliothek ist in der Web Server entsprechend Java EE 7 vorhanden. Sie können diese Bibliothek herunterladen oder Maven benutzen
Mit 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 verteilt in 2 Haupt API.
  • API Streaming (javax.json.stream),
  • JSON API Object Model (javax.json).
Streaming API wird zur Analyse des JSON Dokument durch das Durchsuchen von oben nach unten benutzt. Und bei einer Analyse einer Elemente des Dokument sendet es ein Ereignis (event). API eignet für die Analyse der großen JSON Dokument weil es die Daten auf dem Speicher nicht speichern
Die API Object Model sind einfach und leicht zu benutzen. Denn es benutzt API Streaming um das ganze Dokument JSON zu lesen und das Objekt mit der Baumstruktur auf dem Speicher zu erstellen. API passt zur Analyse des kleinen JSON Dokument

4. Create Maven Project

Sie können ein Maven Projekt schnell erstellen und die Benutzung der Bibliothek JSON-P melden
die Bibliothek 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. Die Überblick von JSON-P

Einige wichtige Interface vom JSON API sind:
Interface
Die Bezeichnung
javax.json.JsonReader
Sie können es benutzen um das JSON Objekt oder ein Array zu lesen und das JsonObject zu schaffen. Sie können JsonReader aus der KlasseJson oder JsonReaderFactory.
javax.json.JsonWriter
Sie können diese Klasse benutzen um das JSON Objekt in Output Stream zu schreiben
javax.json.stream.JsonParser
Es funktioniert wie einen vollen Analyser und bietet das Stream zur Lesen-Unterstützung des JSON-Objekt.
javax.json.stream.JsonGenerator
Sie können diese Klasse benutzen um das JSON-Objekt in Output Stream zu schreiben
javax.json.Json
Diese Klasse wird benutzt um die Objekt zur JSON Behandlung zu erstellen

6. Das Beispiel über JSON-P

Das ist eine DatenFile JSON:
company.txt
{
  "id": 111 ,
  "name":"Microsoft",
  "websites": [
     "http://microsoft.com",
     "http://msn.com",
     "http://hotmail.com"
  ],
  "address":{
     "street":"1 Microsoft Way",
     "city":"Redmond"
  }
}
Beachten Sie: Der Name der Attribute soll in der Anführungszeichen "" liegen, zum Beispiel:
  • "id": 111
Manchmal hat Daten JSON die Attribute, die nicht in der Anführungszeichen liegen. Einige Part der Analyse JSON versteht auch und erlaubt das. Aber die Analyse JSON-P erlaubt nicht wenn Sie Java JSON-P benutzt um ein Daten JSON, die nicht in der Anführungszeichen liegen, zu analysieren, bekommen Sie eine Ausnahme
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 ist ein Objekt zum Lesen der Daten JSON. Sie können das Objekt JsonReader aus der Klasse Json oder aus JsonReaderFactory.lesen
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);
     
  }

}
Das Beispiel durchführen

7. Das Beispiel mit 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. Das Beispiel mit JsonParser

Oben haben Sie mit JsonReader gearbeitet um die File json. Alle Inhalt Json wird auf dem Speicher archiviert. Diese Maßnahme entspricht der kleinen Daten Json. Bei der großen Daten sollen Sie zur Analyse der Daten Json JsonParser benutzen. Die Arbeitsweise vom JsonParser ist so ziemlich ähnlich wie die Analyse der XML von SAX. JsonParser archiviert den Daten auf dem Speicher nicht
Auf Ihre Kode rufen Sie die Methode next() auf damit JsonParser die nächste Elemente Json analysiert . Es sendet ein Event nach der Analyse einer Elemente. Die Analyse kann die folgenden Events schicken
  • START_OBJECT
  • END_OBJECT
  • START_ARRAY
  • END_ARRAY
  • KEY_NAME
  • VALUE_STRING
  • VALUE_NUMBER
  • VALUE_TRUE
  • VALUE_FALSE
  • VALUE_NULL.
Nach dem gesendeten Eventsname und dem analysierten Elementenname können Sie die analysierte Position kennen und die Wert bei der Position entnehmen
Die Methode können in diesem Fall benutzt werden:
  • getString()
  • getInt()
  • ....
Das Beispiel gucken:
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);
        }
    }

}
Das Beispiel durchführen