JSON之Jackson(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010376788/article/details/51169888

JSON之Jackson(一)

JSON之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文件的例子:
{
  "brand": "Mercedes",
  "doors": 5,
  "owner": {
    "first": "Gatsby",
    "last": "Newton"
  },
  "component": ["engine", "brake"]
}

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配置:
<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 {
		// Read JSON from a Reader instance.
//            Reader reader = new StringReader(carJson);
//            JsonNode node = objectMapper.readValue(reader, JsonNode.class);
		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";
		// Read JSON from an local file.
//            File file = new File(path);
		// Read JSON from an InputStream.
		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();
		}
	}
}


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


参考文献:

猜你喜欢

转载自blog.csdn.net/u010376788/article/details/51169888
今日推荐