一、簡介
Jackson解析的速度算是同類框架中最快的,同時也是Spring MVC中內置使用的解析方式。
Jackson可以輕松的將Java對象轉換成json對象和xml文檔,同樣也可以將json、xml轉換成Java對象。相比json-lib框架,Jackson所依賴的jar包較少,簡單易用並且性能也要相對高些。
二、JackSon的使用
Jackson提供了很多類和方法,而在序列化和反序列化中使用的最多的類則是ObjectMapper這個類,此類比較類似於Json-lib中JsonObject和ArrayObject。此類中提供了readTree(),readValue(),writeValueAsString()等方法用於轉換。具體關於此類的說明文檔地址是:http://tool.oschina.net/uploads/apidocs/jackson-1.9.9/org/codehaus/jackson/map/ObjectMapper.html
下面中所涉及到的objectMapper均是來至於ObjectMapper objectMapper = new ObjectMapper()。
1、導入jar包
//maven公共直接導入依賴
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
2、創建Object類
/*例如創建一個雇員類*/
public class Employee { private int id; private String name; private int age;
...省略getter、setter
}
Json格式的文件data.json如下:
{
"id" : 123,
"name" : "Henry Smith",
"age" : 28,
"salary" : 2000
}
1、通過文件將Json與對象相互轉換
public void testJsonToObject() throws JsonParseException, JsonMappingException, IOException{ ObjectMapper objectMapper = new ObjectMapper();
//將json格式數據從文件讀入,並轉換為對象 Employee emp = objectMapper.readValue(new File("src/data.json"), Employee.class); System.out.println(emp.toString()); } public void testObjectTojson() throws JsonParseException, JsonMappingException, IOException{ ObjectMapper objectMapper = new ObjectMapper(); Employee emp = objectMapper.readValue(new File("src/data.json"), Employee.class); //將對象轉化為json格式,並存入到文件中 objectMapper.writeValue(new File("src/data1.json"), emp); //將對象轉化為json格式數據,並輸出到控制台上 objectMapper.writeValue(System.out, emp);
2、通過I/O流將Json與對象相互轉換
public void testInputStream() throws JsonParseException, JsonMappingException, IOException{
//創建ObjectMapper對象 ObjectMapper objectMapper = new ObjectMapper();
//將json格式數據從文件讀入,並轉換為對象 Employee emp = objectMapper.readValue(new FileInputStream("src/data.json"), Employee.class); System.out.println(emp.toString()); }
public void testOutPutStream() throws JsonParseException, JsonMappingException, IOException{ ObjectMapper objectMapper = new ObjectMapper(); Employee emp = objectMapper.readValue(new File("src/data.json"), Employee.class); //將對象轉化為json格式,並存入到文件中 objectMapper.writeValue(new FileOutputStream("src/data1.json"), emp);
3、從URL中讀取數據(若URL返回的滿足Employee類的json數據)
Employee emp1 = objectMapper.readValue("http://www.xxx.com/xxx", Employee.class); JsonNode jsonNode = objectMapper.readTree("http://www.xxx.com/xxx");
4、常用方法
可通過ObjectMapper類實現Json格式數據與Object轉換
類ObjectMapper:此映射器(或數據綁定器或編解碼器)提供了在Java對象(JDK提供的核心類,bean的實例)和匹配的JSON構造之間進行轉換的功能。它將使用
JsonParser
和JsonGenerator
實現JSON的實際讀/寫實例。
<T>T readValue(File src, Class<T> valueType)
<T>T readValue(InputStream src, Class<T> valueType)
JsonNode readTree(URL source)將JSON內容反序列化為使用
JsonNode
實例集表示的樹的方法void writeValue(File resultFile, Object value)將Object輸出為JSON到File文件中
void writeValue(OutputStream out, Object value)
void writeValue(Writer w, Object value)
String writeValueAsString(Object value)可用於將任何Java值序列化為String的方法。
TypeFactory getTypeFactory()用於獲取當前配置
TypeFactory
實例的訪問器。
類TypeFactory:final修飾,從Jackson 1.8開始,
JavaType
給定各種輸入時用於創建具體實例的類。應該使用通過ObjectMapper
(並通過DeserializationConfig
和 公開SerializationConfig
)配置的實例來完成使用。
JavaType constructParametricType(Class<?> parametrized, Class<?>... parameterClasses)用於構造的工廠方法
JavaType
表示參數化類型。JavaType constructParametricType(Class<?> parametrized, JavaType... parameterTypes)用於構造的工廠方法
JavaType
表示參數化類型。
更多ObjectMapper的API詳見:http://tool.oschina.net/uploads/apidocs/jackson-1.9.9/org/codehaus/jackson/map/ObjectMapper.html
更多TypeFactory的API詳見:http://tool.oschina.net/uploads/apidocs/jackson-1.9.9/org/codehaus/jackson/map/type/TypeFactory.html
代碼實例,可抽取為JsonUtils

package com.example; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; /** * */ public class JsonUtils { // 定義jackson對象 private static final ObjectMapper MAPPER = new ObjectMapper(); /** * 將對象轉換成json字符串。 * <p>Title: pojoToJson</p> * <p>Description: </p> * @param data * @return */ public static String objectToJson(Object data) { try { String string = MAPPER.writeValueAsString(data); return string; } catch (JsonProcessingException e) { e.printStackTrace(); } return null; } /** * 將json結果集轉化為對象 * * @param jsonData json數據 * @param clazz 對象中的object類型 * @return */ public static <T> T jsonToPojo(String jsonData, Class<T> beanType) { try { T t = MAPPER.readValue(jsonData, beanType); return t; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 將json數據轉換成pojo對象list * <p>Title: jsonToList</p> * <p>Description: </p> * @param jsonData * @param beanType * @return */ public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) { JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType); try { List<T> list = MAPPER.readValue(jsonData, javaType); return list; } catch (Exception e) { e.printStackTrace(); } return null; } }