Jackson(二)
来源:互联网 发布:b2b2c php开源 编辑:程序博客网 时间:2024/06/01 10:08
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";
-
- JsonFactory jsonFactory = new JsonFactory();
- User user = new User();
-
- try {
- JsonParser parser = jsonFactory.createParser(new File(path));
- parser.nextToken();
- 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中创建。如:
-
- public static void writeSimpleToFile(){
-
- JsonFactory jsonFactory = new JsonFactory();
- OutputStream outputStream = null;
-
-
- 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();
-
-
-
-
-
- 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编程中经常遇到,这是可以用的。但是对于那种建议不要使用的方法,最好弃之不用。
-
- public static void writeComplexToFile(){
-
-
-
-
- JsonFactory jsonFactory = new ObjectMapper().getJsonFactory();
-
- OutputStream outputStream = null;
-
-
- 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);
-
-
- 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