欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解析Java的Jackson库中Streaming API的使用

程序员文章站 2024-03-08 21:18:46
流式api读取和写入json内容离散事件。 jsonparser读取数据,而jsongenerator写入数据。它是三者中最有效的方法,是最低开销和最快的读/写操作。它类似...

流式api读取和写入json内容离散事件。 jsonparser读取数据,而jsongenerator写入数据。它是三者中最有效的方法,是最低开销和最快的读/写操作。它类似于xml的stax解析器。

在本文中,我们将展示的使用jackson的流式api 读写json数据。流式api工作使用json为每一个细节的都是要小心处理。下面的例子将使用两个类:
jsongenerator类——写入json字符串。
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,并用write***()方法来写每一个json值。
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<string,object> 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]