1.JSON简介
JSON的全称是JavaScript Object Notation,是一种轻量级的数据交换格式。 JSON与 XML具有相同的特性,例如易于人编写和阅读,易于机器生成和解析。但是 JSON比XML数据传输的有效性要高出很多。 JSON完全独立与编程语言,使用文本格式保存。JSON的数据格式是名/值对,其中值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
- {
- "brand": "Mercedes",
- "doors": 5,
- "owner": {
- "first": "Gatsby",
- "last": "Newton"
- },
- "component": ["engine", "brake"]
- }
2.Jackson
Jackson提供了两种不同的JSON解析器:
- ObjectMapper:把JSON解析到自定义的Java类中,或者解析到一个Jackson指定的树形结构中(Tree model)。
- Jackson JsonParser:一种“拉式”(pull)解析器,每次解析一组JSON数据。
Jackson也包含了两种不同的JSON生成器:
- ObjectMapper:把自定义的Java类,或者一个Jackson指定的树形结构生成为JSON文件。
- Jackson JsonGenerator:每次只生成一组JSON数据。
3.Jackson的安装
Jackson包含一个core JAR,和两个依赖core JAR的JAR:
- Jackson Core
- Jackson Annotations
- Jackson Databind
其中Jackson Annotations依赖Jackson Core,Jackson Databind依赖Jackson Annotations。
这三个JAR可以从Maven中央仓库下载,然后放在CLASSPATH中,也可以用Maven配置:
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>${jackson-version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- <version>${jackson-version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-annotations</artifactId>
- <version>${jackson-version}</version>
- </dependency>
4.ObjectMapper
4.1ObjectMapper解析JSON
com.fasterxml.jackson.databind.ObjectMapper在Jackson Databind中。ObjectMapper可以从String,File,InputStream,URL,自定义的Java类中读取JSON,ObjectMapper中的重载方法readValue()实现了这些功能。下面看从String读取;
- public static void readFromString(){
- String carJson = "{ \"brand\" : \"Mercedes\"," +
- " \"doors\" : 5," +
- " \"owners\" : [\"John\", \"Jack\", \"Jill\"]," +
- " \"nestedObject\" : { \"field\" : \"value\" } }";
-
- ObjectMapper objectMapper = new ObjectMapper();
-
- try {
-
-
-
- JsonNode node = objectMapper.readValue(carJson, JsonNode.class);
-
- JsonNode brandNode = node.get("brand");
- String brand = brandNode.asText();
- System.out.println("brand = " + brand);
-
- JsonNode doorsNode = node.get("doors");
- Integer doors = doorsNode.asInt();
- System.out.println("doors = " + doors);
-
- JsonNode owners = node.get("owners");
- JsonNode johnNode = owners.get(0);
- String owner = johnNode.asText();
- System.out.println("john = " + owner);
-
- JsonNode nestNode = node.get("nestedObject");
- JsonNode fieldNode = nestNode.get("field");
- String field = fieldNode.asText();
- System.out.println("field = " + field);
- }
- catch (Exception e){
- e.printStackTrace();
- }
- }
ObjectMapper如果解析JSON到Java类,那么这个Java类必须是简单的POJO,这个POJO的User的代码就不贴了:
- public static void readToPOJO()throws IOException{
-
- String json = "{ \"name\": \"Gatsby\","
- + " \"gender\": \"MALE\","
- + " \"age\": 24"
- + "}";
- ObjectMapper objectMapper = new ObjectMapper();
-
- try{
- User user = objectMapper.readValue(json, User.class);
- System.out.print(user.toString());
- }
- catch (Exception e){
- e.printStackTrace();
- }
- }
下面ObjectMapper从File中解析JSON的例子,至于URL等就不一一列举了:
car.json文件:
- {
- "brand": "Mercedes",
- "doors": 5,
- "owner": {
- "first": "Gatsby",
- "last": "Newton"
- },
- "component": ["engine", "brake"]
- }
示例代码:
- public static void readFromFile(){
-
- try {
- String path = "F:\\Codes\\IDEA\\Tools\\data\\json\\car.json";
-
-
-
- InputStream input = new FileInputStream(path);
- ObjectMapper objectMapper = new ObjectMapper();
- JsonNode node = objectMapper.readValue(input, JsonNode.class);
-
- JsonNode brandNode = node.get("brand");
- String brand = brandNode.asText();
- System.out.println("brand = " + brand);
-
- JsonNode doorsNode = node.get("doors");
- Integer doors = doorsNode.asInt();
- System.out.println("doors = " + doors);
-
- JsonNode ownerNode = node.get("owner");
- JsonNode nameNode = ownerNode.get("first");
- String first = nameNode.asText();
- System.out.println("first = " + first);
-
- JsonNode comsNode = node.get("component");
- JsonNode comNode = comsNode.get(0);
- String component = comNode.asText();
- System.out.println("component = " + component);
- }
- catch (Exception e){
- e.printStackTrace();
- }
- }
4.2ObjectMapper生成JSON
和解析JSON一样,ObjectMapper也可以把JSON生成到String,自定义的Java类,File中。如生成到String中:
- public static void writeToString(){
- Car car = new Car("BMW", 4, new Car.Owner("Gatsby", "Newton"), new String[]{"engine", "brake"});
-
- ObjectMapper objectMapper = new ObjectMapper();
-
- try{
- String json = objectMapper.writeValueAsString(car);
- System.out.println(json);
- }
- catch (Exception e){
- e.printStackTrace();
- }
- }
生成到File中:
- public static void writeToFile()throws IOException{
- Car car = new Car("BMW", 4, new Car.Owner("Gatsby", "Newton"), new String[]{"engine", "brake"});
-
- ObjectMapper objectMapper = new ObjectMapper();
- OutputStream outputStream = null;
-
- try{
- outputStream = new FileOutputStream(new File("F:\\Codes\\IDEA\\Tools\\data\\json\\out\\out.json"));
- objectMapper.writeValue(outputStream, car);
- }
- catch (Exception e){
- e.printStackTrace();
- }
- finally {
- if (outputStream != null){
- outputStream.close();
- }
- }
- }
参考文献:
博文转自:http://blog.csdn.net/u010376788/article/details/51169888