日期:2014-05-16  浏览次数:20315 次

Jackson 框架,轻易转换JSON(转)

Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。

前面有介绍过json-lib这个框架,在线博文:http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html

相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。

?

?

一、 准备工作

1、 下载依赖库jar包

Jackson的jar all下载地址:http://jackson.codehaus.org/1.7.6/jackson-all-1.7.6.jar

然后在工程中导入这个jar包即可开始工作

官方示例:http://wiki.fasterxml.com/JacksonInFiveMinutes

因为下面的程序是用junit测试用例运行的,所以还得添加junit的jar包。版本是junit-4.10

如果你需要转换xml,那么还需要stax2-api.jar

?

2、 测试类基本代码如下

?

package com.zhuc.javalibtest.jackson;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.codehaus.jackson.JsonEncoding;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.JsonNodeFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * @author zhuc
 * @version 2012-5-25 上午10:33:48
 */
public class JacksonTest {
	private JsonGenerator jsonGenerator = null;
	private ObjectMapper objectMapper = null;

	/**
	 * 
	 */
	@Before
	public void init() {
		objectMapper = new ObjectMapper();
		try {
			jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(
					System.out, JsonEncoding.UTF8);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 
	 */
	@After
	public void destory() {
		try {
			if (jsonGenerator != null) {
				jsonGenerator.flush();
				if (!jsonGenerator.isClosed()) {
					jsonGenerator.close();
				}
			}
			jsonGenerator = null;
			objectMapper = null;
			System.gc();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

?

package com.zhuc.javalibtest.jackson;

/**
 * @author zhuc
 * @version 2012-5-25 上午11:14:52
 */
public class Car {

	private String name;
	private Integer capacity;

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name
	 *            the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the capacity
	 */
	public Integer getCapacity() {
		return capacity;
	}

	/**
	 * @param capacity
	 *            the capacity to set
	 */
	public void setCapacity(Integer capacity) {
		this.capacity = capacity;
	}

}
?

二、 Java 对象转换成 JSON

1、 JavaBean(Entity/Model)转换成JSON

?

	/**
	 * 将javaBean对象转换成json字符串
	 */
	@Test
	public void writeEntityJSON() {
		try {
			System.out.println("jsonGenerator");
			// writeObject可以转换java对象,eg:JavaBean/Map/List/Array等
			Car c = new Car();
			c.setName("zhuc-jackson-car");
			c.setCapacity(100);
			jsonGenerator.writeObject(c);
			System.out.println();
			System.out.println("ObjectMapper");
			// writeValue具有和writeObject相同的功能
			objectMapper.writeValue(System.out, c);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

?

运行后结果如下:

jsonGenerator
{"name":"zhuc-jackson-car","capacity":100}
ObjectMapper
{"name":"zhuc-jackson-car","capacity":100}

?

?

????? 上面分别利用JsonGenerator的writeObject方法和ObjectMapper的writeValue方法完成对Java对象的 转换,二者传递的参数及构造的方式不同;JsonGenerator的创建依赖于ObjectMapper对象。也就是说如果你要使用 JsonGenerator来转换JSON,那么你必须创建一个ObjectMapper。但是你用ObjectMapper来转换JSON,则不需要 JSONGenerator。

????? objectMapper的writeValue方法可以将一个Java对象转换成JSON。这个方法的参数一,需要提供一个输出流,转换后可以通 过这个流来输出转换后的内容。或是提供一个File,将转换后的内容写入到File中。当然,这个参数也可以接收一个JSONGenerator,然后通 过