Jackson可以輕松的將java對象轉(zhuǎn)換成json對象和xml文檔,同樣也可以將json、xml轉(zhuǎn)換成Java對象。
前面有介紹過json-lib這個框架,在線博文:http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html
相比json-lib框架,Jackson所依賴的jar包較少,簡單易用并且性能也要相對高些。而且Jackson社區(qū)相對比較活躍,更新速度也比較快。
一、準(zhǔn)備工作
1、 下載依賴庫jar包
Jackson的jar all下載地址:http://jackson.codehaus.org/1.7.6/jackson-all-1.7.6.jar
然后在工程中導(dǎo)入這個jar包即可開始工作
官方示例:http://wiki.fasterxml.com/JacksonInFiveMinutes
因為下面的程序是用junit測試用例運行的,所以還得添加junit的jar包。版本是junit-4.2.8
如果你需要轉(zhuǎn)換xml,那么還需要stax2-api.jar
2、 測試類基本代碼如下
package com.hoo.test;import java.io.IOException;import java.io.StringWriter;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import java.util.Set;import org.codehaus.jackson.JsonEncoding;import org.codehaus.jackson.JsonGenerationException;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.codehaus.jackson.xml.XmlMapper;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.hoo.entity.AccountBean;/*** <b>function:</b>Jackson 將java對象轉(zhuǎn)換成JSON字符串,也可以將JSON字符串轉(zhuǎn)換成java對象* jar-lib-version: jackson-all-1.6.2* jettison-1.0.1* @author hoojo* @createDate 2010-11-23 下午04:54:53* @file JacksonTest.java* @package com.hoo.test* @PRoject Spring3* @blog http://blog.csdn.net/IBM_hoojo* @email hoojo_@126.com* @version 1.0*/@SuppressWarnings("unchecked")public class JacksonTest {private JsonGenerator jsonGenerator = null;private ObjectMapper objectMapper = null;private AccountBean bean = null;@Beforepublic void init() {bean = new AccountBean();bean.setAddress("china-Guangzhou");bean.setEmail("hoojo_@126.com");bean.setId(1);bean.setName("hoojo");objectMapper = new ObjectMapper();try {jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);} catch (IOException e) {e.printStackTrace();}}@Afterpublic void destory() {try {if (jsonGenerator != null) {jsonGenerator.flush();}if (!jsonGenerator.isClosed()) {jsonGenerator.close();}jsonGenerator = null;objectMapper = null;bean = null;System.gc();} catch (IOException e) {e.printStackTrace();}}}3、 所需要的JavaEntity
package com.hoo.entity;public class AccountBean {private int id;private String name;private String email;private String address;private Birthday birthday;//getter、setter@Overridepublic String toString() {return this.name + "#" + this.id + "#" + this.address + "#" + this.birthday + "#" + this.email;}}Birthday
package com.hoo.entity;public class Birthday {private String birthday;public Birthday(String birthday) {super();this.birthday = birthday;}//getter、setterpublic Birthday() {}@Overridepublic String toString() {return this.birthday;}}二、Java對象轉(zhuǎn)換成JSON
1、 JavaBean(Entity/Model)轉(zhuǎn)換成JSON
/*** <b>function:</b>將java對象轉(zhuǎn)換成json字符串* @author hoojo* @createDate 2010-11-23 下午06:01:10*/@Testpublic void writeEntityJSON() {try {System.out.println("jsonGenerator");//writeObject可以轉(zhuǎn)換java對象,eg:JavaBean/Map/List/Array等jsonGenerator.writeObject(bean);System.out.println();System.out.println("ObjectMapper");//writeValue具有和writeObject相同的功能objectMapper.writeValue(System.out, bean);} catch (IOException e) {e.printStackTrace();}}運行后結(jié)果如下:
jsonGenerator{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}ObjectMapper{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}上面分別利用JsonGenerator的writeObject方法和ObjectMapper的writeValue方法完成對Java對象的轉(zhuǎn)換,二者傳遞的參數(shù)及構(gòu)造的方式不同;JsonGenerator的創(chuàng)建依賴于ObjectMapper對象。也就是說如果你要使用JsonGenerator來轉(zhuǎn)換JSON,那么你必須創(chuàng)建一個ObjectMapper。但是你用ObjectMapper來轉(zhuǎn)換JSON,則不需要JSONGenerator。
objectMapper的writeValue方法可以將一個Java對象轉(zhuǎn)換成JSON。這個方法的參數(shù)一,需要提供一個輸出流,轉(zhuǎn)換后可以通過這個流來輸出轉(zhuǎn)換后的內(nèi)容。或是提供一個File,將轉(zhuǎn)換后的內(nèi)容寫入到File中。當(dāng)然,這個參數(shù)也可以接收一個JSONGenerator,然后通過JSONGenerator來輸出轉(zhuǎn)換后的信息。第二個參數(shù)是將要被轉(zhuǎn)換的Java對象。如果用三個參數(shù)的方法,那么是一個Config。這個config可以提供一些轉(zhuǎn)換時的規(guī)則,過指定的Java對象的某些屬性進行過濾或轉(zhuǎn)換等。
2、 將Map集合轉(zhuǎn)換成Json字符串
/*** <b>function:</b>將map轉(zhuǎn)換成json字符串* @author hoojo* @createDate 2010-11-23 下午06:05:26*/@Testpublic void writeMapJSON() {try {Map<String, Object> map = new HashMap<String, Object>();map.put("name", bean.getName());map.put("account", bean);bean = new AccountBean();bean.setAddress("china-Beijin");bean.setEmail("hoojo@QQ.com");map.put("account2", bean);System.out.println("jsonGenerator");jsonGenerator.writeObject(map);System.out.println("");System.out.println("objectMapper");objectMapper.writeValue(System.out, map);} catch (IOException e) {e.printStackTrace();}}轉(zhuǎn)換后結(jié)果如下:
jsonGenerator{"account2":{"address":"china-Beijin","name":null,"id":0,"birthday":null,"email":"hoojo@qq.com"},"name":"hoojo","account":{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}}objectMapper{"account2":{"address":"china-Beijin","name":null,"id":0,"birthday":null,"email":"hoojo@qq.com"},"name":"hoojo","account":{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}}3、 將List集合轉(zhuǎn)換成json
/*** <b>function:</b>將list集合轉(zhuǎn)換成json字符串* @author hoojo* @createDate 2010-11-23 下午06:05:59*/@Testpublic void writeListJSON() {try {List<AccountBean> list = new ArrayList<AccountBean>();list.add(bean);bean = new AccountBean();bean.setId(2);bean.setAddress("address2");bean.setEmail("email2");bean.setName("haha2");list.add(bean);System.out.println("jsonGenerator");//list轉(zhuǎn)換成JSON字符串jsonGenerator.writeObject(list);System.out.println();System.out.println("ObjectMapper");//用objectMapper直接返回list轉(zhuǎn)換成的JSON字符串System.out.println("1###" + objectMapper.writeValueAsString(list));System.out.print("2###");//objectMapper list轉(zhuǎn)換成JSON字符串objectMapper.writeValue(System.out, list);} catch (IOException e) {e.printStackTrace();}}結(jié)果如下:
jsonGenerator[{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"},{"address":"address2","name":"haha2","id":2,"birthday":null,"email":"email2"}]ObjectMapper1###[{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"},{"address":"address2","name":"haha2","id":2,"birthday":null,"email":"email2"}]2###[{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"},{"address":"address2","name":"haha2","id":2,"birthday":null,"email":"email2"}]外面就是多了個[]中括號;同樣Array也可以轉(zhuǎn)換,轉(zhuǎn)換的JSON和上面的結(jié)果是一樣的,這里就不再轉(zhuǎn)換了。~.~
4、下面來看看jackson提供的一些類型,用這些類型完成json轉(zhuǎn)換;如果你使用這些類型轉(zhuǎn)換JSON的話,那么你即使沒有JavaBean(Entity)也可以完成復(fù)雜的Java類型的JSON轉(zhuǎn)換。下面用到這些類型構(gòu)建一個復(fù)雜的Java對象,并完成JSON轉(zhuǎn)換。
@Testpublic void writeOthersJSON() {try {String[] arr = { "a", "b", "c" };System.out.println("jsonGenerator");String str = "hello world jackson!";//bytejsonGenerator.writeBinary(str.getBytes());//booleanjsonGenerator.writeBoolean(true);//nulljsonGenerator.writeNull();//floatjsonGenerator.writeNumber(2.2f);//charjsonGenerator.writeRaw("c");//StringjsonGenerator.writeRaw(str, 5, 10);//StringjsonGenerator.writeRawValue(str, 5, 5);//StringjsonGenerator.writeString(str);jsonGenerator.writeTree(JsonNodeFactory.instance.POJONode(str));System.out.println();//ObjectjsonGenerator.writeStartObject();//{jsonGenerator.writeObjectFieldStart("user");//user:{jsonGenerator.writeStringField("name", "jackson");//name:jacksonjsonGenerator.writeBooleanField("sex", true);//sex:truejsonGenerator.writeNumberField("age", 22);//age:22jsonGenerator.writeEndObject();//}jsonGenerator.writeArrayFieldStart("infos");//infos:[jsonGenerator.writeNumber(22);//22jsonGenerator.writeString("this is array");//this is arrayjsonGenerator.writeEndArray();//]jsonGenerator.writeEndObject();//}