1. 程式人生 > >springmvc之Jackson實現po物件與Json字串的互轉

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]