Jackson之一

1.JSON简介

JSON的全称是JavaScript Object Notation,是一种轻量级的数据交换格式。 JSON与 XML具有相同的特性,例如易于人编写和阅读,易于机器生成和解析。但是 JSON比XML数据传输的有效性要高出很多。 JSON完全独立与编程语言,使用文本格式保存。JSON的数据格式是名/值对,其中值可以是:

  1. 数字(整数或浮点数)
  2. 字符串(在双引号中)
  3. 逻辑值(true 或 false)
  4. 数组(在方括号中)
  5. 对象(在花括号中)
  6. null
更多关于JSON的数据格式的说明可以参考JSON官方网站: http://www.json.org,也可以参考中文网站: http://www.json.org/json-zh.html。下面是一个JSON文件的例子:
[java]  view plain  copy
  1. {  
  2.   "brand""Mercedes",  
  3.   "doors"5,  
  4.   "owner": {  
  5.     "first""Gatsby",  
  6.     "last""Newton"  
  7.   },  
  8.   "component": ["engine""brake"]  
  9. }  

2.Jackson

Jackson是一种JSON API,也是最流行,速度最快的JSON API。Jackson的在线API文档可以在 http://wiki.fasterxml.com/JacksonInFiveMinutes中找到。Jackson的源代码托管在: https://github.com/FasterXML/jackson
Jackson提供了两种不同的JSON解析器:
  1. ObjectMapper:把JSON解析到自定义的Java类中,或者解析到一个Jackson指定的树形结构中(Tree model)。
  2. Jackson JsonParser:一种“拉式”(pull)解析器,每次解析一组JSON数据。
Jackson也包含了两种不同的JSON生成器:
  1. ObjectMapper:把自定义的Java类,或者一个Jackson指定的树形结构生成为JSON文件。
  2. Jackson JsonGenerator:每次只生成一组JSON数据。

3.Jackson的安装

Jackson包含一个core JAR,和两个依赖core JAR的JAR:
  1. Jackson Core
  2. Jackson Annotations
  3. Jackson Databind
其中Jackson Annotations依赖Jackson Core,Jackson Databind依赖Jackson Annotations。
这三个JAR可以从Maven中央仓库下载,然后放在CLASSPATH中,也可以用Maven配置:
[html]  view plain  copy
  1. <dependency>  
  2.       <groupId>com.fasterxml.jackson.core</groupId>  
  3.       <artifactId>jackson-databind</artifactId>  
  4.       <version>${jackson-version}</version>  
  5. </dependency>  
  6. <dependency>  
  7.       <groupId>com.fasterxml.jackson.core</groupId>  
  8.       <artifactId>jackson-core</artifactId>  
  9.       <version>${jackson-version}</version>  
  10. </dependency>  
  11. <dependency>  
  12.       <groupId>com.fasterxml.jackson.core</groupId>  
  13.       <artifactId>jackson-annotations</artifactId>  
  14.       <version>${jackson-version}</version>  
  15. </dependency>  

4.ObjectMapper

4.1ObjectMapper解析JSON

com.fasterxml.jackson.databind.ObjectMapper在Jackson Databind中。ObjectMapper可以从String,File,InputStream,URL,自定义的Java类中读取JSON,ObjectMapper中的重载方法readValue()实现了这些功能。下面看从String读取;

[java]  view plain  copy
  1. public static void readFromString(){  
  2.     String carJson =  "{ \"brand\" : \"Mercedes\"," +  
  3.                     "  \"doors\" : 5," +  
  4.                     "  \"owners\" : [\"John\", \"Jack\", \"Jill\"]," +  
  5.                     "  \"nestedObject\" : { \"field\" : \"value\" } }";  
  6.   
  7.     ObjectMapper objectMapper = new ObjectMapper();  
  8.   
  9.     try {  
  10.         // Read JSON from a Reader instance.  
  11. //            Reader reader = new StringReader(carJson);  
  12. //            JsonNode node = objectMapper.readValue(reader, JsonNode.class);  
  13.         JsonNode node = objectMapper.readValue(carJson, JsonNode.class);  
  14.   
  15.         JsonNode brandNode = node.get("brand");  
  16.         String brand = brandNode.asText();  
  17.         System.out.println("brand = " + brand);  
  18.   
  19.         JsonNode doorsNode = node.get("doors");  
  20.         Integer doors = doorsNode.asInt();  
  21.         System.out.println("doors = " + doors);  
  22.   
  23.         JsonNode owners = node.get("owners");  
  24.         JsonNode johnNode = owners.get(0);  
  25.         String owner = johnNode.asText();  
  26.         System.out.println("john = " + owner);  
  27.   
  28.         JsonNode nestNode = node.get("nestedObject");  
  29.         JsonNode fieldNode = nestNode.get("field");  
  30.         String field = fieldNode.asText();  
  31.         System.out.println("field = " + field);  
  32.     }  
  33.     catch (Exception e){  
  34.         e.printStackTrace();  
  35.     }  
  36. }  

ObjectMapper如果解析JSON到Java类,那么这个Java类必须是简单的POJO,这个POJO的User的代码就不贴了:

[java]  view plain  copy
  1. public static void readToPOJO()throws IOException{  
  2.   
  3.         String json = "{ \"name\": \"Gatsby\","  
  4.                     + "  \"gender\": \"MALE\","  
  5.                     + "  \"age\": 24"  
  6.                     + "}";  
  7.         ObjectMapper objectMapper = new ObjectMapper();  
  8.   
  9.         try{  
  10.             User user = objectMapper.readValue(json, User.class);  
  11.             System.out.print(user.toString());  
  12.         }  
  13.         catch (Exception e){  
  14.             e.printStackTrace();  
  15.         }  
  16.     }  

下面ObjectMapper从File中解析JSON的例子,至于URL等就不一一列举了:
car.json文件:
[java]  view plain  copy
  1. {  
  2.   "brand""Mercedes",  
  3.   "doors"5,  
  4.   "owner": {  
  5.     "first""Gatsby",  
  6.     "last""Newton"  
  7.   },  
  8.   "component": ["engine""brake"]  
  9. }  

示例代码:
[java]  view plain  copy
  1. public static void readFromFile(){  
  2.   
  3.     try {  
  4.         String path = "F:\\Codes\\IDEA\\Tools\\data\\json\\car.json";  
  5.         // Read JSON from an local file.  
  6. //            File file = new File(path);  
  7.         // Read JSON from an InputStream.  
  8.         InputStream input = new FileInputStream(path);  
  9.         ObjectMapper objectMapper = new ObjectMapper();  
  10.         JsonNode node = objectMapper.readValue(input, JsonNode.class);  
  11.   
  12.         JsonNode brandNode = node.get("brand");  
  13.         String brand = brandNode.asText();  
  14.         System.out.println("brand = " + brand);  
  15.   
  16.         JsonNode doorsNode = node.get("doors");  
  17.         Integer doors = doorsNode.asInt();  
  18.         System.out.println("doors = " + doors);  
  19.   
  20.         JsonNode ownerNode = node.get("owner");  
  21.         JsonNode nameNode = ownerNode.get("first");  
  22.         String first = nameNode.asText();  
  23.         System.out.println("first = " + first);  
  24.   
  25.         JsonNode comsNode = node.get("component");  
  26.         JsonNode comNode = comsNode.get(0);  
  27.         String component = comNode.asText();  
  28.         System.out.println("component = " + component);  
  29.     }  
  30.     catch (Exception e){  
  31.         e.printStackTrace();  
  32.     }  
  33. }  

4.2ObjectMapper生成JSON

和解析JSON一样,ObjectMapper也可以把JSON生成到String,自定义的Java类,File中。如生成到String中:

[java]  view plain  copy
  1. public static void writeToString(){  
  2.     Car car = new Car("BMW"4new Car.Owner("Gatsby""Newton"), new String[]{"engine""brake"});  
  3.   
  4.     ObjectMapper objectMapper = new ObjectMapper();  
  5.   
  6.     try{  
  7.         String json = objectMapper.writeValueAsString(car);  
  8.         System.out.println(json);  
  9.     }  
  10.     catch (Exception e){  
  11.         e.printStackTrace();  
  12.     }  
  13. }  

生成到File中:

[java]  view plain  copy
  1. public static void writeToFile()throws IOException{  
  2.     Car car = new Car("BMW"4new Car.Owner("Gatsby""Newton"), new String[]{"engine""brake"});  
  3.   
  4.     ObjectMapper objectMapper = new ObjectMapper();  
  5.     OutputStream outputStream = null;  
  6.   
  7.     try{  
  8.         outputStream = new FileOutputStream(new File("F:\\Codes\\IDEA\\Tools\\data\\json\\out\\out.json"));  
  9.         objectMapper.writeValue(outputStream, car);  
  10.     }  
  11.     catch (Exception e){  
  12.         e.printStackTrace();  
  13.     }  
  14.     finally {  
  15.         if (outputStream != null){  
  16.             outputStream.close();  
  17.         }  
  18.     }  
  19. }  


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


参考文献:

博文转自:http://blog.csdn.net/u010376788/article/details/51169888
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值