1、Jackson的使用
Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社 区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一 。 Spring MVC 的默认 json 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快;Jackson 运行时占用内存比较低,性能比较好;Jackson 有灵活的 API,可以很容易进行扩展和定制。
1.1 Jackson常用注解
注解 | 说明 |
---|---|
@JsonIgnore | 使用@JsonIgnore注解JSON序列化时将忽略该字段。示例: @JsonIgnore |
@JsonProperty | 用于属性,把属性的名称序列化时转换为另外一个名称。示例: @JsonProperty("blog-remark") |
@JsonFormat | 用于属性或者方法,把属性的格式序列化时转换成指定的格式。示例: @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") |
@JsonPropertyOrder | 用于类, 指定属性在序列化时 json 中的顺序 , 示例: @JsonPropertyOrder({ "birth_Date", "name" }) public class Person |
@JsonCreator | 用于构造方法,和 @JsonProperty 配合使用,适用有参数的构造方法。 示例: @JsonCreator public Person(@JsonProperty("name")String name) {…} |
@JsonAnySetter | 用于属性或者方法,设置未反序列化的属性名和值作为键值存储到 map 中 @JsonAnySetter public void set(String key, Object value) { map.put(key, value); } |
@JsonAnyGetter | 用于方法 ,获取所有未序列化的属性 public Map<String, Object> any() { return map; } |
1.2 Jackson的简单应用
添加pom.xml配置信息:
<!-- Jackson依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.9</version>
</dependency>
创建UserInfo(用户信息实体类),用于JSON序列化示例使用。
示例要求:
(1)使用@JsonIgnore注解,序列化时忽略登录密码字段。
(2)使用@JsonProperty注解,将blogRemark字段序列化时转换为blog-remark。
(3)使用@JsonFormat注解,序列化时将日期格式化。
package com.pjb.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Date;
/**
* 用户信息实体类
* @author pan_junbiao
**/
public class UserInfo
{
/**
* 用户名称
*/
private String userName;
/**
* 登录密码
* 使用@JsonIgnore注解
* JSON序列化时将忽略该字段
*/
@JsonIgnore
private String password;
/**
* 博客地址
*/
private String blogUrl;
/**
* 博客信息
* 使用@JsonProperty注解
* 把属性的名称序列化时转换为另外一个名称
*/
@JsonProperty("blog-remark")
private String blogRemark;
/**
* 创建时间
* 使用@JsonFormat注解
* 把属性的格式序列化时转换成指定的格式
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date createDate;
//省略getter与setter方法...
}
1.2.1 将实体类转换为JSON
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* 将实体类转换为JSON
* @author pan_junbiao
*/
@Test
public void entityToJson() throws Exception
{
//用户信息实体类
UserInfo userInfo = new UserInfo();
userInfo.setUserName("pan_junbiao的博客");
userInfo.setPassword("123456");
userInfo.setBlogUrl("https://blog.csdn.net/pan_junbiao");
userInfo.setBlogRemark("您好,欢迎访问 pan_junbiao的博客");
userInfo.setCreateDate(new Date());
//将参数转换成JSON对象
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(userInfo);
//打印结果
System.out.println(json);
}
执行结果:
1.2.2 将JSON转换为实体类
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* 将JSON转换为实体类
* @author pan_junbiao
*/
@Test
public void jsonToEntity() throws Exception
{
//JSON内容
String json = "{\n" +
"\t\"userName\": \"pan_junbiao的博客\",\n" +
"\t\"password\": \"123456\",\n" +
"\t\"blogUrl\": \"https://blog.csdn.net/pan_junbiao\",\n" +
"\t\"blog-remark\": \"您好,欢迎访问 pan_junbiao的博客\",\n" +
"\t\"createDate\": \"2020-05-30 16:18:28\"\n" +
"}";
//将JSON转换为实体类
ObjectMapper mapper = new ObjectMapper();
UserInfo userInfo = mapper.readValue(json, UserInfo.class);
//打印结果
System.out.println("用户名称:" + userInfo.getUserName());
System.out.println("登录密码:" + userInfo.getPassword());
System.out.println("博客地址:" + userInfo.getBlogUrl());
System.out.println("博客信息:" + userInfo.getBlogRemark());
System.out.println("创建时间:" + userInfo.getCreateDate());
}
执行结果:
2、创建Jackson工具类
在项目中创建Jackson工具类(JacksonUtil.java)。
package com.pjb.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Jackson工具类
* @author pan_junbiao
**/
public class JacksonUtil
{
private static ObjectMapper mapper = new ObjectMapper();
/**
* 将对象转换成JSON数据
* @param data 对象
* @return JSON数据
*/
public static String getBeanToJson(Object data)
{
try
{
String result = mapper.writeValueAsString(data);
return result;
}
catch (JsonProcessingException e)
{
e.printStackTrace();
}
return null;
}
/**
* 将JSON数据转换成对象
* @param jsonData JSON数据
* @param beanType 对象类型
* @return 对象
*/
public static <T> T getJsonToBean(String jsonData, Class<T> beanType)
{
try
{
T result = mapper.readValue(jsonData, beanType);
return result;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
/**
* 将JSON数据转换成列表
* @param jsonData JSON数据
* @param beanType 对象类型
* @return 列表
*/
public static <T> List<T> getJsonToList(String jsonData, Class<T> beanType)
{
try
{
JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, beanType);
List<T> resultList = mapper.readValue(jsonData, javaType);
return resultList;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
/**
* 将JSON数据转换成Set集合
* @param jsonData JSON数据
* @param elementType 元素类型
* @return Set集合
*/
public static <E> Set<E> getJsonToSet(String jsonData, Class<E> elementType)
{
try
{
JavaType javaType = mapper.getTypeFactory().constructCollectionType(Set.class, elementType);
Set<E> resultSet = mapper.readValue(jsonData, javaType);
return resultSet;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
/**
* 将JSON数据转换成Map集合
* @param jsonData JSON数据
* @param keyType 键类型
* @param valueType 值类型
* @return Map集合
*/
public static <K, V> Map<K, V> getJsonToMap(String jsonData, Class<K> keyType, Class<V> valueType)
{
try
{
JavaType javaType = mapper.getTypeFactory().constructMapType(Map.class, keyType, valueType);
Map<K, V> resultMap = mapper.readValue(jsonData, javaType);
return resultMap;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
}
(1)将JSON数据转换成Set集合。
/**
* 将JSON数据转换成Set集合
* @author pan_junbiao
*/
@Test
public void setTest()
{
Set<String> userSet = new HashSet<>();
userSet.add("pan_junbiao的博客");
userSet.add("您好,欢迎访问 pan_junbiao的博客");
userSet.add("https://blog.csdn.net/pan_junbiao");
//将Set转化为JSON数据
String json = JacksonUtil.getBeanToJson(userSet);
System.out.println(json + "\n");
//将JSON数据转换成Set集合
Set<String> jsonToSet = JacksonUtil.getJsonToSet(json,String.class);
for(String item : jsonToSet)
{
System.out.println(item);
}
}
执行结果:
(2)将JSON数据转换成Map集合。
/**
* 将JSON数据转换成Map集合
* @author pan_junbiao
*/
@Test
public void mapTest()
{
Map<String, String> userMap = new HashMap<>();
userMap.put("userName", "pan_junbiao的博客");
userMap.put("blogUrl", "https://blog.csdn.net/pan_junbiao");
userMap.put("blogRemark", "您好,欢迎访问 pan_junbiao的博客");
//将map转化为JSON数据
String json = JacksonUtil.getBeanToJson(userMap);
//将JSON数据转换成Map集合
Map<String, String> jsonToMap = JacksonUtil.getJsonToMap(json, String.class, String.class);
System.out.println("用户名称:" + jsonToMap.get("userName"));
System.out.println("博客地址:" + jsonToMap.get("blogUrl"));
System.out.println("博客备注:" + jsonToMap.get("blogRemark"));
}
执行结果: