1. 程式人生 > >基於jackson的Json與物件的互相轉換

基於jackson的Json與物件的互相轉換

  在JavaWeb開發中,經常會涉及到相關的json與物件的互相轉化問題,下面我就將其轉化的過程中可能遇到的情況一一寫出。

新增依賴

jackson依賴

    <!--jackson-->
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.9.13</version
>
</dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency>

其它常用的工具包依賴

        <dependency
>
<groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-guava</artifactId> <version>2.9.4</version> </dependency> <dependency> <groupId>org.apache.commons</groupId
>
<artifactId>commons-lang3</artifactId> <version>3.5</version> </dependency>

封裝的JsonMapper類

package com.lyc.demo;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;
import org.codehaus.jackson.type.JavaType;
import org.codehaus.jackson.type.TypeReference;

@Slf4j
public class JsonMapper {

    private  static ObjectMapper objectMapper = new ObjectMapper();

    static {
        //FAIL_ON_UNKNOWN_PROPERTIES在序列化的時候,如果遇到不認識的欄位的處理方式
        //預設啟用特性,這意味著在遇到未知屬性時丟擲JsonMappingException。在引入該特性之前,這是預設的預設設定。
        objectMapper.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
        //FAIL_ON_EMPTY_BEANS決定了在沒有找到型別的存取器時發生了什麼(並且沒有註釋表明它是被序列化的)。如果啟用(預設),
        // 將丟擲一個異常來指明這些是非序列化型別;如果禁用了,它們將被序列化為空物件,即沒有任何屬性。
        //請注意,這個特性只對那些沒有任何識別註釋的“空”bean產生影響(如@json序列化):那些有註釋的bean不會導致丟擲異常。
        objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS,false);
        //過濾類的屬性id
        objectMapper.setFilters(new SimpleFilterProvider().setFailOnUnknownId(false));
        //在序列化時,只有那些值為null或被認為為空的值的屬性才不會被包含在內。
        objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY);
    }

    /**
     * 物件轉換成json
     * @param obj
     * @param <T>
     * @return
     */
    public static <T>String objectToJson(T obj){
        if(obj == null){
            return null;
        }
        try {
            return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj);
        } catch (Exception e) {
            log.warn("Parse Object to Json error",e);
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 物件轉換成格式化的json
     * @param obj
     * @param <T>
     * @return
     */
    public static <T>String objectToJsonPretty(T obj){
        if(obj == null){
            return null;
        }
        try {
            return obj instanceof String ? (String) obj : objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
        } catch (Exception e) {
            log.warn("Parse Object to Json error",e);
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 將json轉換成物件Class
     * @param src
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T>T jsonToObject(String src,Class<T> clazz){
        if(StringUtils.isEmpty(src) || clazz == null){
            return null;
        }
        try {
            return clazz.equals(String.class) ? (T) src : objectMapper.readValue(src,clazz);
        } catch (Exception e) {
            log.warn("Parse Json to Object error",e);
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 將json轉換成物件TypeReference
     * @param src
     * @param typeReference
     * @param <T>
     * @return
     */
    public static <T>T jsonToObject(String src, TypeReference<T> typeReference){
        if(StringUtils.isEmpty(src) || typeReference == null){
            return null;
        }
        try {
            return (T)(typeReference.getType().equals(String.class) ? src : objectMapper.readValue(src, typeReference));
        } catch (Exception e) {
            log.warn("Parse Json to Object error",e);
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 將json轉換成物件
     * @param src
     * @param collectionClass
     * @param elementClasses
     * @param <T>
     * @return
     */
    public static <T>T jsonToObject(String src, Class<?> collectionClass,Class<?>... elementClasses){
        JavaType javaType = objectMapper.getTypeFactory().constructParametricType(collectionClass,elementClasses);
        try {
            return objectMapper.readValue(src,javaType);
        } catch (Exception e) {
            log.warn("Parse Json to Object error",e);
            e.printStackTrace();
            return null;
        }
    }

}

備註的待測試實體類

User.java

package com.lyc.demo;

import lombok.*;

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {

    private int id;
    private String name;

}

Student.java

package com.lyc.demo;

import lombok.*;

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Student {

    //id
    private int id;
    //姓名
    private String name;
    //年齡
    private Integer age;
    //編號
    private String no;
}

測試程式碼

物件轉換成Json

package com.lyc.demo;

import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;

@Slf4j
public class ObjectToJsonTest {

    private User user;

    @Before
    public void testBefore(){
        user = User.builder()
                .id(1)
                .name("zhangsan")
                .build();
    }

    /**
     * 將物件轉換成字串
     */
    @Test
    public void testObjectToJson(){
        String userJson = JsonMapper.objectToJson(user);
        log.info(userJson);
    }

    /**
     * 將物件轉換成格式化的字串
     */
    @Test
    public void testObjectToJsonPretty(){
        String userJson = JsonMapper.objectToJsonPretty(user);
        log.info(userJson);
    }

}

Json轉換成物件

package com.lyc.demo;

import lombok.extern.slf4j.Slf4j;
import org.codehaus.jackson.type.TypeReference;
import org.junit.Before;
import org.junit.Test;

@Slf4j
public class JsonToObjectTest {

    private String json;

    /**
     * 準備json資料
     */
    @Before
    public void testBofore(){
        //初始化User物件
        User user = User.builder()
                .id(1)
                .name("zhangsan")
                .build();
        //將物件轉化成字串
        json = JsonMapper.objectToJson(user);
    }

    /**
     * 將json轉換成物件User(TypeReference)
     */
    @Test
    public void jsonToObjectTypeReference(){
        //將json字串轉換成User物件
        User user = JsonMapper.jsonToObject(json, new TypeReference<User>(){});
        //如果轉換不為空
        if(user != null){
            log.info("user.id = " + user.getId() + "," + "user.name = " + user.getName());
        } else {
            log.error("Json轉換物件失敗!");
        }
    }

    /**
     * 將json轉換成物件User(Class)
     */
    @Test
    public void jsonToObjectByClass(){
        //將json字串轉換成User物件
        User user = JsonMapper.jsonToObject(json, User.class);
        //如果轉換不為空
        if(user != null){
            log.info("user.id = " + user.getId() + "," + "user.name = " + user.getName());
        } else {
            log.error("Json轉換物件失敗!");
        }
    }

}

Json與List物件互轉

package com.lyc.demo;

import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.codehaus.jackson.type.TypeReference;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

@Slf4j
public class JsonToList {

    private String json;

    /**
     * 將list物件轉換成json
     */
    @Before
    public void testListToJson(){
        User user1 = User.builder()
                .id(1)
                .name("zhangsan")
                .build();
        User user2 = User.builder()
                .id(2)
                .name("lisi")
                .build();
        List<User> list = Lists.newArrayList();
        list.add(user1);
        list.add(user2);
        json = JsonMapper.objectToJson(list);
    }

    /**
     * 將json轉換成list物件(TypeReference)
     */
    @Test
    public void testJsonToListTypeReference(){
        List<User> list = JsonMapper.jsonToObject(json, new TypeReference<List<User>>() {
        });
        if(list != null){
            User user1 = list.get(0);
            User user2 = list.get(1);
            log.info("user1.id = " + user1.getId() + ",user1.name = " + user1.getName());
            log.info("user2.id = " + user2.getId() + ",user2.name = " + user2.getName());
        }
    }

    /**
     * 將json轉換成list物件
     */
    @Test
    public void testJsonToListClass(){
        List<User> list = JsonMapper.jsonToObject(json, List.class,User.class);
        if(list != null){
            User user1 = list.get(0);
            User user2 = list.get(1);
            log.info("user1.id = " + user1.getId() + ",user1.name = " + user1.getName());
            log.info("user2.id = " + user2.getId() + ",user2.name = " + user2.getName());
        }
    }

}

Json與Map物件互轉

package com.lyc.demo;

import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.codehaus.jackson.type.TypeReference;
import org.junit.Before;
import org.junit.Test;

import java.util.Map;

@Slf4j
public class JsonToMap {

    private String json;

    /**
     * 將map物件轉換成json
     */
    @Before
    public void testMapToJson(){
        User user1 = User.builder()
                .id(1)
                .name("zhangsan")
                .build();
        User user2 = User.builder()
                .id(2)
                .name("lisi")
                .build();
        Map<String,User> map = Maps.newHashMap();
        map.put("user1",user1);
        map.put("user2",user2);
        json = JsonMapper.objectToJson(map);
    }

    /**
     * 將json轉換成map物件(TypeReference)
     */
    @Test
    public void testJsonToMapTypeReference(){
        Map<String,User> map = JsonMapper.jsonToObject(json, new TypeReference<Map<String,User>>() {
        });
        if(map != null){
            User user1 = map.get("user1");
            User user2 = map.get("user2");
            log.info("user1.id = " + user1.getId() + ",user1.name = " + user1.getName());
            log.info("user2.id = " + user2.getId() + ",user2.name = " + user2.getName());
        }
    }

    /**
     * 將json轉換成mao物件(Class)
     */
    @Test
    public void testJsonToMapClass(){
        Map<String,User> map = JsonMapper.jsonToObject(json, Map.class,String.class,User.class);
        if(map != null){
            User user1 = map.get("user1");
            User user2 = map.get("user2");
            log.info("user1.id = " + user1.getId() + ",user1.name = " + user1.getName());
            log.info("user2.id = " + user2.getId() + ",user2.name = " + user2.getName());
        }
    }
}

Json與物件在轉換中遇到空屬性

package com.lyc.demo;

import lombok.extern.slf4j.Slf4j;
import org.codehaus.jackson.type.TypeReference;
import org.junit.Before;
import org.junit.Test;

@Slf4j
public class JsonToStudentTest {

    private String json;

    /**
     * 將student物件轉換成json()
     */
    @Before
    public void testStudentToJson(){
        Student student = Student.builder()
                .id(1)
                .name("zhangsan")
                .age(null)
                .build();
        json = JsonMapper.objectToJson(student);
        log.info("轉換成的student的json資訊如下:");
        log.info(json);
    }

    /**
     * 將json轉換成student(TypeReference)
     */
    @Test
    public void testJsonToStudentTypeReference(){
        Student student = JsonMapper.jsonToObject(json, new TypeReference<Student>() {
        });
        log.info("student.id = " + student.getId() + ",student.name = " + student.getName() +
                ",student.age = " + student.getAge() + ",student.no = " + student.getNo());
    }

    /**
     * 將json轉換成student(Class)
     */
    @Test
    public void testJsonToStudentClass(){
        Student student = JsonMapper.jsonToObject(json, Student.class);
        log.info("student.id = " + student.getId() + ",student.name = " + student.getName() +
                ",student.age = " + student.getAge() + ",student.no = " + student.getNo());
    }
}