一、简介
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; } }