注意事项:
①json字符串与对象互转时,对象必须实现序列化接口
②标准json中,要求键和值都要有双引号.(数值类型可以不需要双引号)
准备jar包
jackson-databind.jar
jackson-core.jar
jackson-annotations.jar
json与string互转的核心类ObjectMapper
JsonUtils.java
package pers.zwy.ls.util;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* @author Weiyu Zheng
* @date 2019/8/19
*/
public class JsonUtils {
//对象处理类
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 对象转json字符串
* @param object
* @param <T>
* @return
*/
public static <T> String objectToJson(T object){
String jsonStr = null;
try{
jsonStr = MAPPER.writeValueAsString(object);
}catch (Exception e){
e.printStackTrace();
}
return jsonStr;
}
public static <T> T stringToObject(String jsonStr,Class<T> objClass){
T object = null;
try {
//禁用bean不包含的属性,以免反序列化被打断:如:json中包含4个属性的键值对,但是bean中只有2个属性
MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
object = MAPPER.readValue(jsonStr, objClass);
}catch (Exception e){
e.printStackTrace();
}
return object;
}
}
测试类
package pers.zwy.ls.util;
import org.junit.Test;
import pers.zwy.ls.domain.Admin;
import static org.junit.Assert.*;
/**
* @author Weiyu Zheng
* @date 2019/8/19
*/
public class JsonUtilsTest {
@Test
public void objectToJson() {
Admin a = new Admin();
a.setId(10001000);
a.setPassword("123456");
String json = JsonUtils.objectToJson(a);
System.out.println(json);//{"id":10001000,"password":"123456"}
}
@Test
public void stringToObject() {
String json = "{\"id\":1111,\"password\":\"2222\"}";
Admin admin = JsonUtils.stringToObject(json,Admin.class);
System.out.println(admin);//Admin{id=1111, password='2222'}
}
}
ps:字符串转对象时,json数据必须使用双引号,如果是单引号会抛出异常
com.fasterxml.jackson.core.JsonParseException: Unexpected character (''' (code 39)): was expecting double-quote to start field name