基於jackson的Json與物件的互相轉換
阿新 • • 發佈:2018-12-27
在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());
}
}