1.简介
在默认情况下(即不对ObjectMapper做任何额外配置,也不对Java对象加任何Annotation),ObjectMapper依赖于Java对象的默认的无参构造函数进行反序列化,并且严格地通过getter和setter的命名规约进行序列化和反序列化。所以当实体类没有相应的属性,会直接报异常。
2.测试默认情况
/**
* 测试用户
*/
@ToString
@Accessors(chain = true)
public class TestUser {
@Setter
@Getter
private String name;
}
/**
* 测试入口
*/
public class TestJackson {
public static void main(String[] args) {
String json = "{\"name\":\"测试用户\", \"ip\": \"127.0.0.1\"}";
System.out.println("json2Object >>>: " + JacksonUtil.json2Object(json, TestUser.class));
}
}
// 测试结果 由于ip在类中不存在 所以直接报异常
// com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "ip"
3.设置找不到字段不抛出异常
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
设置之后重新执行测试,会得到测试结果
json2Object >>>: TestUser(name=测试用户)
4.附录 jackson工具类
/**
* jackson 的工具类
*/
public final class JacksonUtil {
private static final ObjectMapper objectMapper;
private JacksonUtil() {
}
static {
objectMapper = new ObjectMapper()
// 反序列化设置 关闭反序列化时Jackson发现无法找到对应的对象字段,便会抛出UnrecognizedPropertyException: Unrecognized field xxx异常
// .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
;
}
/**
* json字符串 转成 java对象
*
* @param json json字符串
* @param cls java类型
* @return {@link T}
*/
public static <T> T json2Object(String json, Class<T> cls) {
T t = null;
try {
t = objectMapper.readValue(json, cls);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return t;
}
/**
* java对象 转成 json字符串
*
* @param obj java对象
* @return {@link String}
*/
public static String object2Json(Object obj) {
String json = null;
try {
json = objectMapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return json;
}
}