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有:

  1. START_OBJECT
  2. END_OBJECT
  3. START_ARRAY
  4. END_ARRAY
  5. FIELD_NAME
  6. VALUE_EMBEDDED_OBJECT
  7. VALUE_FALSE
  8. VALUE_TRUE
  9. VALUE_NULL
  10. VALUE_STRING
  11. VALUE_NUMBER_INT
  12. VALUE_NUMBER_FLOAT
这些Token在JsonToken类中,通过nextToken()获取。
getCurrentName()获取当前Field Name,而Value可以用getText()获取,也可以用getValueAsString()、getValueAsInt()等类似的方法获取。下面是一个简单的例子:
user.json文件:
[java] view plain copy
  1. {  
  2.   "name": {  
  3.     "first""Joe",  
  4.     "last""Sixpack"  
  5.   },  
  6.   "gender""MALE",  
  7.   "verified"false,  
  8.   "userImage""Rm9vYm"  
  9. }  

示例代码:
[java] view plain copy
  1. public static void readFromFile(){  
  2.     String path = "F:\\Codes\\IDEA\\Tools\\data\\json\\user.json";  
  3. //        String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";  
  4.     JsonFactory jsonFactory = new JsonFactory();  
  5.     User user = new User();  
  6.   
  7.     try {  
  8.         JsonParser parser = jsonFactory.createParser(new File(path));  
  9.         parser.nextToken();    //进入JSON的“{”  
  10.         while (parser.nextToken() != JsonToken.END_OBJECT){  
  11.             String fieldName = parser.getCurrentName();  
  12.             parser.nextToken();  
  13.             if(fieldName.equals("name")) {  
  14.                 System.out.println(fieldName + ":");  
  15.                 while (parser.nextToken() != JsonToken.END_OBJECT) {  
  16.                     parser.nextToken();  
  17.                     String field = parser.getCurrentName();  
  18.                     System.out.println("\t" + field + ": " + parser.getValueAsString());  
  19.                 }  
  20.             }  
  21.             else {  
  22.                 System.out.println(fieldName + ": " + parser.getText());  
  23.             }  
  24.         }  
  25.         parser.close();  
  26.     }  
  27.     catch (Exception e){  
  28.         e.printStackTrace();  
  29.     }  
  30. }  

同Jackson ObjectMapper一样,你也可以解析String、Reader、InputStream、URL、byte数组、char数组。
[java] view plain copy
  1. String carJson =  
  2.         "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";  
  3.   
  4. JsonFactory factory = new JsonFactory();  
  5. JsonParser  parser  = factory.createParser(carJson);  

2.Jackson Generator

Jackson Generator用于生成JSON。对于简单的变量这种数据类型,Jackson Generator和Jackson JsonParser一样从JsonFactory中创建。如:
[java] view plain copy
  1. // Write simple variables to file  
  2. public static void writeSimpleToFile(){  
  3.   
  4.     JsonFactory jsonFactory = new JsonFactory();  
  5.     OutputStream outputStream = null;  
  6. //        Car car = new Car("BMW", 4, new Car.Owner("Gatsby", "Newton"), new String[]{"engine", "brake"});  
  7.   
  8.     try {  
  9.         outputStream = new FileOutputStream("F:\\Codes\\IDEA\\Tools\\data\\json\\out\\generate_simple.json");  
  10.         JsonGenerator generator = jsonFactory.createGenerator(outputStream, JsonEncoding.UTF8);  
  11.         generator.writeStartObject();  
  12.   
  13.         generator.writeStringField("brand""Mercedes");  
  14.         generator.writeNumberField("doors"5);  
  15.         generator.writeObjectFieldStart("owner");  
  16.         generator.writeStringField("first""Gatsby");  
  17.         generator.writeStringField("last""Newton");  
  18.         generator.writeEndObject();  
  19.   
  20.         generator.writeArrayFieldStart("component");  
  21.         generator.writeString("engine");  
  22.         generator.writeString("brake");  
  23.         generator.writeEndArray();  
  24.   
  25.         // Write a object.  
  26. //            generator.writeObjectField("owner", new Car.Owner("Gatsby", "Newton"));  
  27. //            generator.writeObjectField("component", new String[]{"engine", "brake"});  
  28.   
  29.         generator.writeEndObject();  
  30.   
  31.         generator.flush();  
  32.         generator.close();  
  33.     }  
  34.     catch (Exception e){  
  35.         e.printStackTrace();  
  36.     }  
  37. }  

但是对于复杂的数据类型,Jackson Generator必须从ObjectMapper.getJsonFactory()的JsonFactory中创建,否则会报一下错误:
[python] view plain copy
  1. 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编程中经常遇到,这是可以用的。但是对于那种建议不要使用的方法,最好弃之不用。

[java] view plain copy
  1. // Write objects to file.  
  2. public static void writeComplexToFile(){  
  3.   
  4.     // If you use JsonFactory jsonFactory = new JsonFactory(), it shows the error:  
  5.     // java.lang.IllegalStateException: No ObjectCodec defined for the generator,  
  6.     // can only serialize simple wrapper types (type passed edu.wzm.jackson.Car$Owner)  
  7.     JsonFactory jsonFactory = new ObjectMapper().getJsonFactory();  
  8.   
  9.     OutputStream outputStream = null;  
  10. //        Car car = new Car("BMW", 4, new Car.Owner("Gatsby", "Newton"), new String[]{"engine", "brake"});  
  11.   
  12.     try {  
  13.         outputStream = new FileOutputStream("F:\\Codes\\IDEA\\Tools\\data\\json\\out\\generate_complex.json");  
  14.         JsonGenerator generator = jsonFactory.createGenerator(outputStream, JsonEncoding.UTF8);  
  15.         generator.writeStartObject();  
  16.   
  17.         generator.writeStringField("brand""Mercedes");  
  18.         generator.writeNumberField("doors"5);  
  19.   
  20.         // Write a object.  
  21.         generator.writeObjectField("owner"new Car.Owner("Gatsby""Newton"));  
  22.         generator.writeObjectField("component"new String[]{"engine""brake"});  
  23.   
  24.         generator.writeEndObject();  
  25.   
  26.         generator.flush();  
  27.         generator.close();  
  28.     }  
  29.     catch (Exception e){  
  30.         e.printStackTrace();  
  31.     }  
  32. }  


例子的源代码托管在:https://github.com/GatsbyNewton/jackson

原创粉丝点击