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 基本用法
一、重命名属性
- publicclassName{
- @JsonProperty("firstName")
- publicString_first_name;
- }
结果是:
- {"firstName":"Bob"}
二、忽略属性
- publicclassValue{
- publicintvalue1;
- @JsonIgnore
- publicintvalue2;
- }
结果是:
- {"value1":42}
①当由json字符串反序列化成pojo时,如果想忽略json字符串中的某些属性这样处理:
- @JsonIgnoreProperties({"extra","uselessValue"})
- publicclassValue{
- publicintvalue;
- }
这样就可以把下面的json字符串反序列化成 Value 对象:
- {"value":42,"extra":"fluffy","uselessValue":-13}
②若反序列化时要忽略所有pojo中不存在的属性可以这样:
- @JsonIgnoreProperties(ignoreUnknown=true)
- publicclassPojoWithAny{
- publicintvalue;
- }
三、指定属性类型
有时候属性的类型并不是你想要的,比如以下情况:
- 反序列化的时候,声明的类型是一个通用类型,但是你知道应该对应哪个具体的实现类。
- 序列化时,你可能不需要一个类的全部属性,只是想要它的父类的属性。
这样处理就可以了:
- publicclassValueContainer{
- //尽管这个属性是Value类型,
- //但是你想在反序列化时将json字符串读取成ValueImpl类型
- @JsonDeserialize(as=ValueImpl.class)
- publicValuevalue;
- //如果你将BasicType的子类AdvancedType的一个对象赋值给这个属性
- //但是你又想按照BasicType类型来序列化
- //(默认是按照属性的运行时类型,即AdvancedType序列化)
- @JsonSerialize(as=BasicType.class)
- //或者用@JsonSerialize(typing=Typing.STATIC)
- publicBasicTypeanother;
- }
四、使用构造器或工厂方法
①Jackson默认使用无参的默认构造器来创建实例,但是也可以使用其他构造器或者静态的工厂方法来创建实例。
- publicclassCtorPOJO{
- privatefinalint_x,_y;
- @JsonCreator
- publicCtorPOJO(@JsonProperty("x")intx,@JsonProperty("y")inty){
- _x=x;
- _y=y;
- }
- }
②静态的工厂方法也是同样的用法。但是还有一个被称作“委托”的另类用法:
- publicclassDelegatingPOJO{
- privatefinalint_x,_y;
- @JsonCreator
- publicDelegatingPOJO(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)
- publicclassPOJOWithFields{
- privateintvalue;
- }
②想要跳过所有方法
- @JsonAutoDetect(getterVisibility=JsonAutoDetect.Visibility.NONE)
- publicclassPOJOWithNoMethod{
- }
③两个加在一起就是只检测属性不检测方法了(鄙人就是为了这个才去读了官方文档的)
- @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY,getterVisibility=JsonAutoDetect.Visibility.NONE)
- publicclassPOJOWithOnlyField{
- }