springmvc之Jackson實現po物件與Json字串的互轉
因為springmvc支援json格式資料轉化使用的是jackson的包,所以今天研究了使用jackson包封裝實現po物件魚json字串的互轉,當然大家也可以使用阿里巴巴的開源包fastjson包
一、準備
如果你需要使用jackson,你必須得匯入相應的架包,有如下三個包
jackson-annotations;jackson-core;jackson-databind
Maven引入依賴程式碼
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.0.6</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>2.0.6</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.3.0</version> </dependency></span>
二、不帶日期的物件實體與json互轉
1.定義實體UserBean.java,DeptBean.java
package com.jackson.bean;
import java.util.List;
public class DeptBean {
private int deptId;
private String deptName;
private List<UserBean> userBeanList;
public int getDeptId() {
return deptId;
}
public void setDeptId(int deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public List<UserBean> getUserBeanList() {
return userBeanList;
}
public void setUserBeanList(List<UserBean> userBeanList) {
this.userBeanList = userBeanList;
}
@Override
public String toString() {
String userBeanListString = "";
for (UserBean userBean : userBeanList) {
userBeanListString += userBean.toString() + "\n";
}
return "DeptBean [deptId=" + deptId + ", deptName=" + deptName
+ ", \nuserBeanListString=" + userBeanListString + "]";
}
public DeptBean(int deptId, String deptName, List<UserBean> userBeanList) {
super();
this.deptId = deptId;
this.deptName = deptName;
this.userBeanList = userBeanList;
}
public DeptBean() {
super();
}
}
</span>
<span style="font-size:18px;">package com.jackson.bean;
public class UserBean {
private int userId;
private String userName;
private String password;
private String email;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "UserBean [userId=" + userId + ", userName=" + userName
+ ", password=" + password + ", email=" + email + "]";
}
public UserBean(int userId, String userName, String password, String email) {
super();
this.userId = userId;
this.userName = userName;
this.password = password;
this.email = email;
}
public UserBean() {
super();
}
}
注意:在實體中必須存在無參的構造方法,否則轉換時會有如下異常;
com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.jackson.bean.UserBean]: can not instantiate from JSON object (need to add/enable type information?)
2.jackson資料轉換工具類
package com.jackson.utils;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* The class JacksonUtil
*
* json字元與對像轉換
*
* @version: $Revision$ $Date$ $LastChangedBy$
*
*/
public final class JacksonUtil {
public static ObjectMapper objectMapper;
/**
* 使用泛型方法,把json字串轉換為相應的JavaBean物件。
* (1)轉換為普通JavaBean:readValue(json,Student.class)
* (2)轉換為List,如List<Student>,將第二個引數傳遞為Student
* [].class.然後使用Arrays.asList();方法把得到的陣列轉換為特定型別的List
*
* @param jsonStr
* @param valueType
* @return
*/
public static <T> T readValue(String jsonStr, Class<T> valueType) {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
}
try {
return objectMapper.readValue(jsonStr, valueType);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* json陣列轉List
* @param jsonStr
* @param valueTypeRef
* @return
*/
public static <T> T readValue(String jsonStr, TypeReference<T> valueTypeRef){
if (objectMapper == null) {
objectMapper = new ObjectMapper();
}
try {
return objectMapper.readValue(jsonStr, valueTypeRef);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 把JavaBean轉換為json字串
*
* @param object
* @return
*/
public static String toJSon(Object object) {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
}
try {
return objectMapper.writeValueAsString(object);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}</span>
3.jackson資料轉換具體實現
<span style="font-size:18px;">package com.jackson.main;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.jackson.bean.DeptBean;
import com.jackson.bean.UserBean;
import com.jackson.utils.JacksonUtil;
/**
* 例項實現利用jackson實現實體物件與json字串的互相轉換
* @author liangming.deng
*
*/
public class JacksonDemo {
public static void main(String[] args){
UserBean userBean1 = new UserBean(1, "liubei", "123", "[email protected]");
UserBean userBean2 = new UserBean(2, "guanyu", "123", "[email protected]");
UserBean userBean3 = new UserBean(3, "zhangfei", "123", "[email protected]");
List<UserBean> userBeans = new ArrayList<>();
userBeans.add(userBean1);
userBeans.add(userBean2);
userBeans.add(userBean3);
DeptBean deptBean = new DeptBean(1, "sanguo", userBeans);
//物件轉json
String userBeanToJson = JacksonUtil.toJSon(userBean1);
String deptBeanToJson = JacksonUtil.toJSon(deptBean);
System.out.println("deptBean to json:" + deptBeanToJson);
System.out.println("userBean to json:" + userBeanToJson);
//json轉字串
UserBean jsonToUserBean = JacksonUtil.readValue(userBeanToJson, UserBean.class);
DeptBean jsonToDeptBean = JacksonUtil.readValue(deptBeanToJson, DeptBean.class);
System.out.println("json to DeptBean" + jsonToDeptBean.toString());
System.out.println("json to UserBean" + jsonToUserBean.toString());
//List 轉json字串
String listToJson = JacksonUtil.toJSon(userBeans);
System.out.println("list to json:" + listToJson);
//陣列json轉 List
List<UserBean> jsonToUserBeans = JacksonUtil.readValue(listToJson, new TypeReference<List<UserBean>>() {
});
String userBeanString = "";
for (UserBean userBean : jsonToUserBeans) {
userBeanString += userBean.toString() + "\n";
}
System.out.println("json to userBeans:" + userBeanString);
}
}
輸出結果:
deptBean to json:{“deptId”:1,”deptName”:”sanguo”,”userBeanList”:[{“userId”:1,”userName”:”liubei”,”password”:”123”,”email”:”[email protected]”},{“userId”:2,”userName”:”guanyu”,”password”:”123”,”email”:”[email protected]”},{“userId”:3,”userName”:”zhangfei”,”password”:”123”,”email”:”[email protected]”}]}
userBean to json:{“userId”:1,”userName”:”liubei”,”password”:”123”,”email”:”[email protected]”}
json to DeptBeanDeptBean [deptId=1, deptName=sanguo,
userBeanListString=UserBean [userId=1, userName=liubei, password=123, [email protected]]
UserBean [userId=2, userName=guanyu, password=123, [email protected]]
UserBean [userId=3, userName=zhangfei, password=123, [email protected]]
]
json to UserBeanUserBean [userId=1, userName=liubei, password=123, [email protected]]
list to json:[{“userId”:1,”userName”:”liubei”,”password”:”123”,”email”:”[email protected]”},{“userId”:2,”userName”:”guanyu”,”password”:”123”,”email”:”[email protected]”},{“userId”:3,”userName”:”zhangfei”,”password”:”123”,”email”:”[email protected]”}]
json to userBeans:UserBean [userId=1, userName=liubei, password=123, [email protected]]
UserBean [userId=2, userName=guanyu, password=123, [email protected]]
UserBean [userId=3, userName=zhangfei, password=123, [email protected]]
三、帶日期的實體物件與json轉換
jackson實現帶日期的實體物件與json轉換有兩種方法
1).將實體物件中的日期物件定義為String型,在使用的時候再將String型轉換為Date型使用,其他就無需修改。
2).當實體物件中的日期物件定義為Date型,就需要通過整合JsonSerializer物件完成日期的轉換,本段將重點講解
1.在UserBean.java和DeptBean.java中分別新增Date createDate
private Date createDate;
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
2.實現集成於JsonSerializer物件的工具類
package com.jackson.utils;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
/**
* jackson日期轉換工具類
*
* @author liangming.deng
*
*/
public class JsonDateFormatFull extends JsonSerializer<Date> {
/**
* Jackson支援日期字串格式
* "yyyy-MM-dd'T'HH:mm:ss.SSSZ" "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
* "EEE, dd MMM yyyy HH:mm:ss zzz" "yyyy-MM-dd"
*/
@Override
public void serialize(Date value, JsonGenerator jgen,
SerializerProvider provider) throws
IOException, JsonProcessingException {
SimpleDateFormat formatter = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss");
String formattedDate = formatter.format(value);
jgen.writeString(formattedDate);
}
}
3.在UserBean.java和DeptBean.java中Date變數加入如下註解
@JsonSerialize(using = JsonDateFormateFull.class)
private Date createDate;
4.jackson日期互轉具體實現
package com.jackson.main;
import java.util.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.jackson.bean.DeptBean;
import com.jackson.bean.UserBean;
import com.jackson.utils.JacksonUtil;
/**
*利用jackson實現Json與實體物件的互轉
* @author liangming.deng
*
*/
public class JacksonDemo {
public static void main(String[] args){
UserBean userBean1 = new UserBean(1, "liubei", "123", "[email protected]");
userBean1.setCreateDate(new Date(Calendar.getInstance().getTimeInMillis()));
UserBean userBean2 = new UserBean(2, "guanyu", "123", "[email protected]");
userBean2.setCreateDate(new Date(Calendar.getInstance().getTimeInMillis()));
UserBean userBean3 = new UserBean(3, "zhangfei", "123", "[email protected]");
userBean3.setCreateDate(new Date(Calendar.getInstance().getTimeInMillis()));
List<UserBean> userBeans = new ArrayList<>();
userBeans.add(userBean1);
userBeans.add(userBean2);
userBeans.add(userBean3);
DeptBean deptBean = new DeptBean(1, "sanguo", userBeans);
deptBean.setCreateDate(new Date(Calendar.getInstance().getTimeInMillis()));
//實體物件 轉json
String userBeanToJson = JacksonUtil.toJSon(userBean1);
String deptBeanToJson = JacksonUtil.toJSon(deptBean);
System.out.println("deptBean to json:" + deptBeanToJson);
System.out.println("userBean to json:" + userBeanToJson);
//json 轉實體物件
UserBean jsonToUserBean = JacksonUtil.readValue(userBeanToJson, UserBean.class);
DeptBean jsonToDeptBean = JacksonUtil.readValue(deptBeanToJson, DeptBean.class);
System.out.println("json to DeptBean" + jsonToDeptBean.toString());
System.out.println("json to UserBean" + jsonToUserBean.toString());
//List 轉json
String listToJson = JacksonUtil.toJSon(userBeans);
System.out.println("list to json:" + listToJson);
//json 轉 List
List<UserBean> jsonToUserBeans = JacksonUtil.readValue(listToJson, new TypeReference<List<UserBean>>() {
});
String userBeanString = "";
for (UserBean userBean : jsonToUserBeans) {
userBeanString += userBean.toString() + "\n";
}
System.out.println("json to userBeans:" + userBeanString);
}
}
5.結果輸出
deptBean to json:{“deptId”:1,”deptName”:”sanguo”,”createDate”:”2014-11-20T10:58:08”,”userBeanList”:[{“userId”:1,”userName”:”liubei”,”password”:”123”,”email”:”[email protected]”,”createDate”:”2014-11-20T10:58:08”},{“userId”:2,”userName”:”guanyu”,”password”:”123”,”email”:”[email protected]”,”createDate”:”2014-11-20T10:58:08”},{“userId”:3,”userName”:”zhangfei”,”password”:”123”,”email”:”[email protected]”,”createDate”:”2014-11-20T10:58:08”}]}
userBean to json:{“userId”:1,”userName”:”liubei”,”password”:”123”,”email”:”[email protected]”,”createDate”:”2014-11-20T10:58:08”}
json to DeptBeanDeptBean [deptId=1, deptName=sanguo,
userBeanListString=UserBean [userId=1, userName=liubei, password=123, [email protected], createDate=Thu Nov 20 18:58:08 CST 2014]
UserBean [userId=2, userName=guanyu, password=123, [email protected], createDate=Thu Nov 20 18:58:08 CST 2014]
UserBean [userId=3, userName=zhangfei, password=123, [email protected], createDate=Thu Nov 20 18:58:08 CST 2014]
]
json to UserBeanUserBean [userId=1, userName=liubei, password=123, [email protected], createDate=Thu Nov 20 18:58:08 CST 2014]
list to json:[{“userId”:1,”userName”:”liubei”,”password”:”123”,”email”:”[email protected]”,”createDate”:”2014-11-20T10:58:08”},{“userId”:2,”userName”:”guanyu”,”password”:”123”,”email”:”[email protected]”,”createDate”:”2014-11-20T10:58:08”},{“userId”:3,”userName”:”zhangfei”,”password”:”123”,”email”:”[email protected]”,”createDate”:”2014-11-20T10:58:08”}]
json to userBeans:UserBean [userId=1, userName=liubei, password=123, [email protected], createDate=Thu Nov 20 18:58:08 CST 2014]
UserBean [userId=2, userName=guanyu, password=123, [email protected], createDate=Thu Nov 20 18:58:08 CST 2014]
UserBean [userId=3, userName=zhangfei, password=123, [email protected], createDate=Thu Nov 20 18:58:08 CST 2014]