解析Java的Jackson库中Streaming API的使用
流式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]