直接上代码
package com.demo.jackson.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
@Slf4j
public class JsonUtil {
private static ObjectMapper objectMapper = new ObjectMapper();
static {
//忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
/\*\*
\* 对象转换成Sting
\* @param obj
\* @param <T>
\* @return
\*/
public static <T> String obj2String(T obj){
if (obj == null) {
return null;
}
try {
return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
System.out.println("Parse Object to String error");
e.printStackTrace();
return null;
}
}
/\*\*
\* 规范地将对象转换成Sting
\* @param obj
\* @param <T>
\* @return
\*/
public static <T> String obj2StringPretty(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 String error",e);
return null;
}
}
/\*\*
\* String转换成obj对象
\* @param str
\* @param clazz
\* @param <T>
\* @return
\*/
public static <T> T str2Obj(String str, Class<T> clazz){
if(str==null){
return null;
}
try {
return clazz.equals(String.class) ? (T) str : objectMapper.readValue(str, clazz);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/\*\*
\* String转换成对象
\* @param str
\* @param typeReference
\* @param <T>
\* @return
\*/
public static <T> T string2Obj(String str, TypeReference<T> typeReference){
if(StringUtils.isEmpty(str) || typeReference == null){
return null;
}
try {
return (T)(typeReference.getType().equals(String.class)? str : objectMapper.readValue(str,typeReference));
} catch (Exception e) {
log.warn("Parse String to Object error",e);
return null;
}
}
/\*\*
\* String转换成对象
\* @param str
\* @param collectionClass
\* @param elementClasses
\* @param <T>
\* @return
\*/
public static <T> T string2Obj(String str, Class<?> collectionClass, Class<?>... elementClasses){
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(collectionClass,elementClasses);
try {
return objectMapper.readValue(str,javaType);
} catch (Exception e) {
log.warn("Parse String to Object error",e);
return null;
}
}
}
测试:
package com.demo.jackson.test;
import com.demo.jackson.entity.Student;
import com.demo.jackson.utils.JsonUtil;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import java.util.*;
@SuppressWarnings("ALL")
public class JacksonTest {
/**
* 序列化
*/
@Test
public void test01(){
Student s = new Student();
s.setName("cjj");
s.setAge(22);
s.setProfileImageUrl("link");
String s1 = JsonUtil.obj2String(s);
System.out.println(s1);
Map<String, List<Integer>> map = new HashMap<>();
map.put("a", Arrays.asList(1, 2, 3));
map.put("b", Arrays.asList(1, 2, 3));
String result1 = JsonUtil.obj2StringPretty(map);
System.out.println(result1);
}
/\*\*
\* 反序列化
\*/
@Test
public void Test02(){
String str = "{\\"name\\":\\"name\\",\\"age\\":10,\\"profileImageUrl\\":\\"link\\"}";
Student student = JsonUtil.str2Obj(str, Student.class);
System.out.println(student);
}
@Test
public void test03() throws Exception {
Student student1 = new Student();
student1.setAge(10);
student1.setName("name1");
student1.setProfileImageUrl("link1");
Student student2 = new Student();
student2.setAge(20);
student2.setName("name2");
student2.setProfileImageUrl("link2");
List<Student> studentList = new ArrayList<>();
studentList.add(student1);
studentList.add(student2);
String result = JsonUtil.obj2String(studentList);
// \[{"name":"name1","age":10,"profileImageUrl":"link1"},{"name":"name2","age":20,"profileImageUrl":"link2"}\]
System.out.println(result);
List<Student> finalList = JsonUtil.string2Obj(result, new TypeReference<List<Student>>() {});
// \[{name=name1, age=10, profileImageUrl=link1}, {name=name2, age=20, profileImageUrl=link2}\]
System.out.println(finalList);
}
@Test
public void test04() throws Exception {
Student student1 = new Student();
student1.setAge(10);
student1.setName("name1");
student1.setProfileImageUrl("link1");
Student student2 = new Student();
student2.setAge(20);
student2.setName("name2");
student2.setProfileImageUrl("link2");
List<Student> studentList = new ArrayList<>();
studentList.add(student1);
studentList.add(student2);
String result = JsonUtil.obj2String(studentList);
// \[{"name":"name1","age":10,"profileImageUrl":"link1"},{"name":"name2","age":20,"profileImageUrl":"link2"}\]
System.out.println(result);
List<Student> finalList = JsonUtil.string2Obj(result, List.class, Student.class);
// \[{name=name1, age=10, profileImageUrl=link1}, {name=name2, age=20, profileImageUrl=link2}\]
System.out.println(finalList);
}
@Test
public void jsonProperty() throws Exception {
String str = "{\\"name\\":\\"name\\",\\"age\\":10,\\"setImage\\":\\"link\\"}";
Student student1 = JsonUtil.string2Obj(str, Student.class);
// name
System.out.println(student1.getName());
//
System.out.println(student1.getAge());
// link
System.out.println(student1.getProfileImageUrl());
// {"name":"name","age":10,"getImage":"link"}
System.out.println(JsonUtil.obj2String(student1));
}
/\*\*
\* 除了将json转为对象外,还可以用Tree Mode方式解析JSON,全程无脑操作,
\* 除了一些特别复杂的JSON,或者只取JSON中的一部分,千万不要用这种二B方式解析JSON。
\* 正确的方式是将JSON直接转为对象。
\* @throws Exception
\*/
@Test
public void parseJson() throws Exception {
String jsonStr = "{\\"name\\":\\"zhansan\\",\\"age\\":100,\\"schools\\":\[{\\"name\\":\\"tsinghua\\",\\"location\\":\\"beijing\\"},{\\"name\\":\\"pku\\",\\"location\\":\\"beijing\\"}\]}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonStr);
String name = jsonNode.get("name").asText();
int age = jsonNode.get("age").asInt();
// name is zhansan age is 100
System.out.println("name is " + name + " age is " + age);
JsonNode schoolsNode = jsonNode.get("schools");
for (int i = 0; i < schoolsNode.size(); i++) {
String schooleName = schoolsNode.get(i).get("name").asText();
String schooleLocation = schoolsNode.get(i).get("location").asText();
// schooleName is tsinghua schooleLocation is beijing
// schooleName is pku schooleLocation is beijing
System.out.println("schooleName is " + schooleName + " schooleLocation is " + schooleLocation);
}
}
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章