JavaのJacksonライブラリにおけるStreaming APIの使用を解析する

9768 ワード

ストリーミングAPIはJSONコンテンツ離散イベントを読み取り、書き込みます.JsonParserはデータを読み込み、JsonGeneratorはデータを書き込みます.これは3つの中で最も効果的な方法であり、最低コストと最も速い読み取り/書き込み操作である.XMLのStax解析器に似ています.
本稿では,Jacksonを用いたストリーミングAPI読み書きJSONデータを示す.ストリーミングAPIの仕事はJSONを使ってすべての細部のために注意して処理します.次の例では、JsonGeneratorクラス――JSON文字列を書き込む2つのクラスを使用します.sonGeneratorは、共通APIによって記述されるJsonコンテンツを定義するベースクラスである.JsonFactoryインスタンスのファクトリメソッドを使用してインスタンスを作成します.
クラス宣言以下はorg.codehaus.jackson.JsonGeneratorクラスの宣言です.

public abstract class JsonGenerator
  extends Object
   implements Closeable

ネストされたクラス
S.N.
クラスと説明
1
static class JsonGenerator.Feature//列挙は、ジェネレータのすべてのtogglable機能を定義します.
フィールド
protected PrettyPrinter _cfgPrettyPrinter-オブジェクト処理相当印刷(通常は余白で結果をより読みやすくする)出力時.
コンストラクタ
S.N.
クラスと説明
1
Default constructor
JsonParserクラス――JSON文字列を解析します.JsonParserは、共通APIが読み出すJsonコンテンツを定義するベースクラスである.JsonFactoryインスタンスのファクトリメソッドを使用してインスタンスを作成します.
クラス宣言以下はorg.codehaus.jackson.JsonParserクラスの宣言です.

public abstract class JsonParser
  extends Object
   implements Closeable, Versioned

ネストされたクラス
S.N.
クラスと説明
1
static class JsonParser.Feature//列挙は、解析器のすべてのtogglable機能を定義します.
2
static class JsonParser.NumberType//は、数値的に使用可能な「ローカル」(最適)タイプを列挙します.
フィールド
  • protected PrettyPrinter _cfgPrettyPrinter-オブジェクト処理はかなり印刷(通常は余分な空白で、結果をより読み取りやすくします)出力されます.
  • protected JsonToken _CurrToken-nextToken()を使用して、最後のトークン(ある場合)を取得します.
  • protected int _Features-ビットフラグビットは、JsonParser.Features構成が有効であることを示します.
  • protected JsonToken _LastClearedToken-最後にトークンをクリアします.つまり、値が有効な場合、clearCurrentToken()が呼び出されます.

  • コンストラクタ
    S.N.
    クラスと説明
    1
    protected JsonParser()/デフォルトのコンストラクタ
    2
    protected JsonParser(int features)
    継承メソッドこのクラスは、次のクラスメソッドを継承します.
     
       
      

    java.lang.Object


    JsonGeneratorを使用してJSONに書き込みJsonGeneratorを使用するのは簡単です.まずJsonFactory.createJsonGenerator()メソッドを使用してJsonGeneratorを作成し、各JSON値をwrite***()メソッドで書きます.
    
    JsonFactory jasonFactory = new JsonFactory();
    JsonGenerator jsonGenerator = jasonFactory.createJsonGenerator(new File(
      "student.json"), JsonEncoding.UTF8);
    // {
    jsonGenerator.writeStartObject();
    // "name" : "Mahesh Kumar"
    jsonGenerator.writeStringField("name", "Mahesh Kumar"); 
    

    JsonGeneratorの操作を見てみましょう.JacksonTesterというJavaクラスファイルをディレクトリC:>Jackson_に作成WORKSPACE.
    File: JacksonTester.java
    
    import java.io.File;
    import java.io.IOException;
    import java.util.Map;
    
    import org.codehaus.jackson.JsonEncoding;
    import org.codehaus.jackson.JsonFactory;
    import org.codehaus.jackson.JsonGenerator;
    import org.codehaus.jackson.JsonParseException;
    import org.codehaus.jackson.map.JsonMappingException;
    import org.codehaus.jackson.map.ObjectMapper;
    
    public class JacksonTester {
      public static void main(String args[]){
       JacksonTester tester = new JacksonTester();
       try {     
         JsonFactory jasonFactory = new JsonFactory();
    
         JsonGenerator jsonGenerator = jasonFactory.createJsonGenerator(new File(
          "student.json"), JsonEncoding.UTF8);
         // {
         jsonGenerator.writeStartObject();
         // "name" : "Mahesh Kumar"
         jsonGenerator.writeStringField("name", "Mahesh Kumar"); 
         // "age" : 21
         jsonGenerator.writeNumberField("age", 21);
         // "verified" : false
         jsonGenerator.writeBooleanField("verified", false); 
         // "marks" : [100, 90, 85]
         jsonGenerator.writeFieldName("marks"); 
         // [
         jsonGenerator.writeStartArray(); 
         // 100, 90, 85
         jsonGenerator.writeNumber(100); 
         jsonGenerator.writeNumber(90); 
         jsonGenerator.writeNumber(85); 
         // ]
         jsonGenerator.writeEndArray(); 
         // }
         jsonGenerator.writeEndObject(); 
         jsonGenerator.close();     
    
         //result student.json
         //{ 
         //  "name":"Mahesh Kumar",
         //  "age":21,
         //  "verified":false,
         //  "marks":[100,90,85]
         //}
         ObjectMapper mapper = new ObjectMapper();
         Map dataMap = mapper.readValue(new File("student.json"), Map.class);
    
         System.out.println(dataMap.get("name"));
         System.out.println(dataMap.get("age"));
         System.out.println(dataMap.get("verified"));
         System.out.println(dataMap.get("marks"));
       } catch (JsonParseException e) {
         e.printStackTrace();
       } catch (JsonMappingException e) {
         e.printStackTrace();
       } catch (IOException e) {
         e.printStackTrace();
       }
      }
    }
    
    

    検証結果
    Javacを使用して次のクラスをコンパイルします.
     
      

    C:\Jackson_WORKSPACE>javac JacksonTester.java


    今jacksonTesterを実行して見た結果:
     
      

    C:\Jackson_WORKSPACE>java JacksonTester


    出力の検証
    
    Mahesh Kumar
    21
    false
    [100, 90, 85]
    

    JsonParserでJSONを読み取るJsonParserを使うのはとても簡単です.まずJsonFactory.createJsonParser()メソッドを使用してJsonParserを作成し、そのnextToken()メソッドを使用して各JSON文字列をタグとして読み込みます.各トークンと対応するプロシージャを確認します.
    
    JsonFactory jasonFactory = new JsonFactory();
    JJsonParser jsonParser = jasonFactory.createJsonParser(new File("student.json"));
    while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
      //get the current token
      String fieldname = jsonParser.getCurrentName();
      if ("name".equals(fieldname)) {
       //move to next token
       jsonParser.nextToken();
       System.out.println(jsonParser.getText());     
      }
    }
    

    JsonParserの操作を見てみましょう.JacksonTesterという名前のJavaクラスフォルダC:>Jackson_を作成WORKSPACE.
    ファイル:JacksonTester.java
    
    import java.io.File;
    import java.io.IOException;
    
    import org.codehaus.jackson.JsonEncoding;
    import org.codehaus.jackson.JsonFactory;
    import org.codehaus.jackson.JsonGenerator;
    import org.codehaus.jackson.JsonParseException;
    import org.codehaus.jackson.JsonParser;
    import org.codehaus.jackson.JsonToken;
    import org.codehaus.jackson.map.JsonMappingException;
    
    public class JacksonTester {
      public static void main(String args[]){
       JacksonTester tester = new JacksonTester();
       try {     
         JsonFactory jasonFactory = new JsonFactory();
    
         JsonGenerator jsonGenerator = jasonFactory.createJsonGenerator(new File(
          "student.json"), JsonEncoding.UTF8);
         jsonGenerator.writeStartObject();
         jsonGenerator.writeStringField("name", "Mahesh Kumar"); 
         jsonGenerator.writeNumberField("age", 21);
         jsonGenerator.writeBooleanField("verified", false); 
         jsonGenerator.writeFieldName("marks"); 
         jsonGenerator.writeStartArray(); // [
         jsonGenerator.writeNumber(100); 
         jsonGenerator.writeNumber(90); 
         jsonGenerator.writeNumber(85); 
         jsonGenerator.writeEndArray(); 
         jsonGenerator.writeEndObject(); 
         jsonGenerator.close();     
    
         //result student.json
         //{ 
         //  "name":"Mahesh Kumar",
         //  "age":21,
         //  "verified":false,
         //  "marks":[100,90,85]
         //}
    
         JsonParser jsonParser = jasonFactory.createJsonParser(new File("student.json"));
         while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
          //get the current token
          String fieldname = jsonParser.getCurrentName();
          if ("name".equals(fieldname)) {
            //move to next token
            jsonParser.nextToken();
            System.out.println(jsonParser.getText());     
          }
          if("age".equals(fieldname)){
            //move to next token
            jsonParser.nextToken();
            System.out.println(jsonParser.getNumberValue());     
          }
          if("verified".equals(fieldname)){
            //move to next token
            jsonParser.nextToken();
            System.out.println(jsonParser.getBooleanValue());     
          }
          if("marks".equals(fieldname)){
            //move to [ 
            jsonParser.nextToken();
            // loop till token equal to "]"
            while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
             System.out.println(jsonParser.getNumberValue()); 
            }
          }
         }
       } catch (JsonParseException e) {
         e.printStackTrace();
       } catch (JsonMappingException e) {
         e.printStackTrace();
       } catch (IOException e) {
         e.printStackTrace();
       }
      }
    }
    
    

    検証結果
    コンパイルはjavacを使用して次のクラスをコンパイルします.
     
      

    C:\Jackson_WORKSPACE>javac JacksonTester.java


    jacksonTesterを実行すると、次の結果が表示されます.
     
      

    C:\Jackson_WORKSPACE>java JacksonTester


    出力の検証
    
    Mahesh Kumar
    21
    false
    [100, 90, 85]