jackson的json转换
public class JacksonJsonUtil {
/**
* 将java对象转换成json字符串
* @param obj 准备转换的对象
* @return json字符串
* @throws Exception
*/
public static String beanToJson(Object obj) throws Exception {
try {
ObjectMapper objectMapper = new ObjectMapper();
String json =objectMapper.writeValueAsString(obj);
return json;
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}
/**
* 将json字符串转换成java对象
* @param json 准备转换的json字符串
* @param cls 准备转换的类
* @return
* @throws Exception
*/
public static Object jsonToBean(String json, Class<?> cls) throws Exception {
try {
<pre name="code" class="java"> ObjectMapper objectMapper = new ObjectMapper();
Object vo = objectMapper.readValue(json, cls);
return vo;
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}
}
Jackson Annotations 基本用法
一、重命名属性
- public class Name {
- @JsonProperty("firstName")
- public String _first_name;
- }
结果是:
- { "firstName" : "Bob" }
二、忽略属性
- public class Value {
- public int value1;
- @JsonIgnore
- public int value2;
- }
结果是:
- { "value1" : 42 }
①当由json字符串反序列化成pojo时,如果想忽略json字符串中的某些属性这样处理:
- @JsonIgnoreProperties({ "extra", "uselessValue" })
- public class Value {
- public int value;
- }
这样就可以把下面的json字符串反序列化成 Value 对象:
- { "value" : 42, "extra" : "fluffy", "uselessValue" : -13 }
②若反序列化时要忽略所有pojo中不存在的属性可以这样:
- @JsonIgnoreProperties(ignoreUnknown=true)
- public class PojoWithAny {
- public int value;
- }
三、指定属性类型
有时候属性的类型并不是你想要的,比如以下情况:
- 反序列化的时候,声明的类型是一个通用类型,但是你知道应该对应哪个具体的实现类。
- 序列化时,你可能不需要一个类的全部属性,只是想要它的父类的属性。
这样处理就可以了:
- public class ValueContainer {
- // 尽管这个属性是 Value 类型,
- // 但是你想在反序列化时将json字符串读取成ValueImpl 类型
- @JsonDeserialize(as=ValueImpl.class)
- public Value value;
- // 如果你将BasicType的子类AdvancedType的一个对象赋值给这个属性
- // 但是你又想按照BasicType类型来序列化
- //(默认是按照属性的运行时类型,即AdvancedType序列化)
- @JsonSerialize(as=BasicType.class)
- // 或者用 @JsonSerialize(typing=Typing.STATIC)
- public BasicType another;
- }
四、使用构造器或工厂方法
①Jackson默认使用无参的默认构造器来创建实例,但是也可以使用其他构造器或者静态的工厂方法来创建实例。
- public class CtorPOJO {
- private final int _x, _y;
- @JsonCreator
- public CtorPOJO(@JsonProperty("x") int x, @JsonProperty("y") int y) {
- _x = x;
- _y = y;
- }
- }
②静态的工厂方法也是同样的用法。但是还有一个被称作“委托”的另类用法:
- public class DelegatingPOJO {
- private final int _x, _y;
- @JsonCreator
- public DelegatingPOJO(Map<String,Object> delegate) {
- _x = (Integer) delegate.get("x");
- _y = (Integer) delegate.get("y");
- }
- }
这种用法只能有一个参数,而且不能带@JsonProperty注解。
五、修改属性自动检测
Jackson默认的属性检测规则是这样的:
- 所有的 public 类型的属性
- 所有的 public 类型的 get 方法
- 所有的 set 方法(无论方法的可见性)
如果默认规则不能满足需求,可以用@JsonAutoDetect注解来改变。
①比如想要自动检测到所有属性(无论该属性的可见性)
- @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)
- public class POJOWithFields {
- private int value;
- }
②想要跳过所有方法
- @JsonAutoDetect(getterVisibility=JsonAutoDetect.Visibility.NONE)
- public class POJOWithNoMethod {
- }
③两个加在一起就是只检测属性不检测方法了(鄙人就是为了这个才去读了官方文档的)
- @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY, getterVisibility=JsonAutoDetect.Visibility.NONE)
- public class POJOWithOnlyField {
- }