JSON之Jackson(二)
来源:互联网 发布:随机化算法 编辑:程序博客网 时间:2024/06/14 00:41
JSON之Jackson(一)
JSON之Jackson(二)
1.Jackson JsonParser
Jackson JsonParser比Jackson ObjectMapper更底层,这就使得Jackson JsonParser比ObjectMapper更快,但是也更加笨重。Jackson JsonParser的工作方式是:将JSON分成一个记号序列,让你迭代记号(Token)序列进行解析。Jackson Parser的Token有:
- START_OBJECT
- END_OBJECT
- START_ARRAY
- END_ARRAY
- FIELD_NAME
- VALUE_EMBEDDED_OBJECT
- VALUE_FALSE
- VALUE_TRUE
- VALUE_NULL
- VALUE_STRING
- VALUE_NUMBER_INT
- VALUE_NUMBER_FLOAT
这些Token在JsonToken类中,通过nextToken()获取。
getCurrentName()获取当前Field Name,而Value可以用getText()获取,也可以用getValueAsString()、getValueAsInt()等类似的方法获取。下面是一个简单的例子:
user.json文件:
{ "name": { "first": "Joe", "last": "Sixpack" }, "gender": "MALE", "verified": false, "userImage": "Rm9vYm"}
示例代码:
public static void readFromFile(){String path = "F:\\Codes\\IDEA\\Tools\\data\\json\\user.json";// String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";JsonFactory jsonFactory = new JsonFactory();User user = new User();try {JsonParser parser = jsonFactory.createParser(new File(path));parser.nextToken(); //进入JSON的“{”while (parser.nextToken() != JsonToken.END_OBJECT){String fieldName = parser.getCurrentName();parser.nextToken();if(fieldName.equals("name")) {System.out.println(fieldName + ":");while (parser.nextToken() != JsonToken.END_OBJECT) {parser.nextToken();String field = parser.getCurrentName();System.out.println("\t" + field + ": " + parser.getValueAsString());}}else {System.out.println(fieldName + ": " + parser.getText());}}parser.close();}catch (Exception e){e.printStackTrace();}}
同Jackson ObjectMapper一样,你也可以解析String、Reader、InputStream、URL、byte数组、char数组。
String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";JsonFactory factory = new JsonFactory();JsonParser parser = factory.createParser(carJson);
2.Jackson Generator
Jackson Generator用于生成JSON。对于简单的变量这种数据类型,Jackson Generator和Jackson JsonParser一样从JsonFactory中创建。如:
// Write simple variables to filepublic static void writeSimpleToFile(){JsonFactory jsonFactory = new JsonFactory();OutputStream outputStream = null;// Car car = new Car("BMW", 4, new Car.Owner("Gatsby", "Newton"), new String[]{"engine", "brake"});try {outputStream = new FileOutputStream("F:\\Codes\\IDEA\\Tools\\data\\json\\out\\generate_simple.json");JsonGenerator generator = jsonFactory.createGenerator(outputStream, JsonEncoding.UTF8);generator.writeStartObject();generator.writeStringField("brand", "Mercedes");generator.writeNumberField("doors", 5);generator.writeObjectFieldStart("owner");generator.writeStringField("first", "Gatsby");generator.writeStringField("last", "Newton");generator.writeEndObject();generator.writeArrayFieldStart("component");generator.writeString("engine");generator.writeString("brake");generator.writeEndArray();// Write a object.// generator.writeObjectField("owner", new Car.Owner("Gatsby", "Newton"));// generator.writeObjectField("component", new String[]{"engine", "brake"});generator.writeEndObject();generator.flush();generator.close();}catch (Exception e){e.printStackTrace();}}
但是对于复杂的数据类型,Jackson Generator必须从ObjectMapper.getJsonFactory()的JsonFactory中创建,否则会报一下错误:
java.lang.IllegalStateException: No ObjectCodec defined for the generator,can only serialize simple wrapper types (type passed edu.wzm.jackson.Car$Owner)
其中,ObjectMapper.getJsonFactory()方法被标记为deprecated,不过这并没有关系,这种情况在Java编程中经常遇到,这是可以用的。但是对于那种建议不要使用的方法,最好弃之不用。
// Write objects to file.public static void writeComplexToFile(){// If you use JsonFactory jsonFactory = new JsonFactory(), it shows the error:// java.lang.IllegalStateException: No ObjectCodec defined for the generator,// can only serialize simple wrapper types (type passed edu.wzm.jackson.Car$Owner)JsonFactory jsonFactory = new ObjectMapper().getJsonFactory();OutputStream outputStream = null;// Car car = new Car("BMW", 4, new Car.Owner("Gatsby", "Newton"), new String[]{"engine", "brake"});try {outputStream = new FileOutputStream("F:\\Codes\\IDEA\\Tools\\data\\json\\out\\generate_complex.json");JsonGenerator generator = jsonFactory.createGenerator(outputStream, JsonEncoding.UTF8);generator.writeStartObject();generator.writeStringField("brand", "Mercedes");generator.writeNumberField("doors", 5);// Write a object.generator.writeObjectField("owner", new Car.Owner("Gatsby", "Newton"));generator.writeObjectField("component", new String[]{"engine", "brake"});generator.writeEndObject();generator.flush();generator.close();}catch (Exception e){e.printStackTrace();}}
例子的源代码托管在:https://github.com/GatsbyNewton/jackson
0 0
- JSON之Jackson(二)
- Java、Json转换方式之二:Jackson
- JSON之Jackson(一)
- JSON解析之Jackson
- JSON 之 jackson 用法
- Json学习(二):java和Jackson操作Json
- Java解析json(二):jackson
- Java JSON(二)5分钟学会Jackson
- Android-json解析(二):Jackson的使用
- Jackson 使用 (二)--jackson,json-lib,StringBuffer拼接性能比较
- Jackson(二) Databind
- Jackson(二)
- Jackson学习二之集合类对象与JSON互相转化
- Jackson转换工具(json)
- JAX-RS之jackson去处理json
- java json 转换之 Jackson 框架
- 解析json之org.codehaus.jackson
- JSON详细学习之JackSon in JAVA
- 【BZOJ1015】星球大战 并查集
- Stack Queue Vector ArrayList
- 无刷新 减少服务器负担 jQuery remove方法
- 第七届蓝桥杯C/C++B组省赛部分题目
- java.io.FileNotFoundException: open failed: EACCES (Permission denied)
- JSON之Jackson(二)
- 每天学习一点新东西
- 设计模式系列总结之策略模式
- java之FileOutputStream
- PHP取整,四舍五入取整、向上取整、向下取整、小数截取。
- 给人类支三招对付AlphaGo
- 腾讯实习生面试2016两道面试题目?(知乎)
- 对一致性Hash算法,Java代码实现的深入研究
- vscode 在ubuntu中打开用户文件夹cpu狂转