Die Anleitung zu Java Json Processing API (JSONP)

1- What is 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- JSON Parser Libraries

Viele Java Open Source Code Bibliothek helfen Ihnen bei der Analyse der Daten Json. Unten ist die Liste dieser Bibliotheke:
  1. json.org
  2. Jackson
  3. Google GSON
  4. json-lib
  5. javax json
  6. json-simple
  7. json-smart
  8. flexjson
  9. 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.
 
  1. API  Streaming (javax.json.stream),
  2. 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- JSON-P Overview

Einige wichtige Interface vom  JSON API sind:
Interface Description
javax.json.JsonReader You can use this to read JSON object or an array to JsonObject. And get JsonReader from Json class or JsonReaderFactory.
javax.json.JsonWriter You can use this to write JSON object to output stream.
javax.json.stream.JsonParser This works as a full parser and provide streaming support for reading JSON objects.
javax.json.stream.JsonGenerator You can use this to write JSON object to output source in streaming way.
javax.json.Json This is the factory class for creating JSON processing objects. This class provides the most commonly used methods for creating these objects and their corresponding factories. The factory classes provide all the various ways to create these objects.

6- JSON-P Example

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- JsonWriter Example

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- JsonParser Example

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 J sonParser benutzen. Die Arbeitsweise vom  JsonParser ist so ziemlich ähnlich wie die Analyse der XML von SAXJsonParser 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