Jackson的json转换和Jackson Annotations 基本用法

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 基本用法

一、重命名属性

Java代码  
  1. public class Name {  
  2.   @JsonProperty("firstName")  
  3.   public String _first_name;  
  4. }  

 结果是:

Java代码  
  1. "firstName" : "Bob" }  

 二、忽略属性

Java代码  
  1. public class Value {  
  2.   public int value1;  
  3.   @JsonIgnore   
  4.   public int value2;  
  5. }  

 结果是:

Java代码  
  1. "value1" : 42 }  

 ①当由json字符串反序列化成pojo时,如果想忽略json字符串中的某些属性这样处理:

Java代码  
  1. @JsonIgnoreProperties({ "extra""uselessValue" })  
  2. public class Value {  
  3.   public int value;  
  4. }  

 这样就可以把下面的json字符串反序列化成 Value 对象:

Java代码  
  1. "value" : 42"extra" : "fluffy""uselessValue" : -13 }  

 ②若反序列化时要忽略所有pojo中不存在的属性可以这样:

Java代码  
  1. @JsonIgnoreProperties(ignoreUnknown=true)  
  2. public class PojoWithAny {  
  3.   public int value;  
  4. }  

 三、指定属性类型

有时候属性的类型并不是你想要的,比如以下情况:

  • 反序列化的时候,声明的类型是一个通用类型,但是你知道应该对应哪个具体的实现类。
  • 序列化时,你可能不需要一个类的全部属性,只是想要它的父类的属性。

这样处理就可以了:

Java代码  
  1. public class ValueContainer {  
  2.   // 尽管这个属性是 Value 类型,  
  3.   // 但是你想在反序列化时将json字符串读取成ValueImpl 类型  
  4.   @JsonDeserialize(as=ValueImpl.class)  
  5.   public Value value;  
  6.   
  7.   // 如果你将BasicType的子类AdvancedType的一个对象赋值给这个属性  
  8.   // 但是你又想按照BasicType类型来序列化  
  9.   //(默认是按照属性的运行时类型,即AdvancedType序列化)  
  10.   
  11.   @JsonSerialize(as=BasicType.class)  
  12.   // 或者用 @JsonSerialize(typing=Typing.STATIC)  
  13.   public BasicType another;  
  14. }  

 四、使用构造器或工厂方法

①Jackson默认使用无参的默认构造器来创建实例,但是也可以使用其他构造器或者静态的工厂方法来创建实例。

Java代码  
  1. public class CtorPOJO {  
  2.    private final int _x, _y;  
  3.   
  4.    @JsonCreator  
  5.    public CtorPOJO(@JsonProperty("x"int x, @JsonProperty("y"int y) {  
  6.       _x = x;  
  7.       _y = y;  
  8.    }  
  9. }  

 ②静态的工厂方法也是同样的用法。但是还有一个被称作“委托”的另类用法:

Java代码  
  1. public class DelegatingPOJO {  
  2.    private final int _x, _y;  
  3.   
  4.    @JsonCreator  
  5.    public DelegatingPOJO(Map<String,Object> delegate) {  
  6.       _x = (Integer) delegate.get("x");  
  7.       _y = (Integer) delegate.get("y");  
  8.    }  
  9. }  

 这种用法只能有一个参数,而且不能带@JsonProperty注解。

五、修改属性自动检测

Jackson默认的属性检测规则是这样的:

  • 所有的 public 类型的属性
  • 所有的 public 类型的 get 方法
  • 所有的 set 方法(无论方法的可见性)

如果默认规则不能满足需求,可以用@JsonAutoDetect注解来改变。

①比如想要自动检测到所有属性(无论该属性的可见性)

Java代码  
  1. @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)  
  2. public class POJOWithFields {  
  3.   private int value;  
  4. }  

 ②想要跳过所有方法

Java代码  
  1. @JsonAutoDetect(getterVisibility=JsonAutoDetect.Visibility.NONE)  
  2. public class POJOWithNoMethod {  
  3.   
  4. }  

 ③两个加在一起就是只检测属性不检测方法了(鄙人就是为了这个才去读了官方文档的)

 

Java代码  
  1. @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY, getterVisibility=JsonAutoDetect.Visibility.NONE)  
  2. public class POJOWithOnlyField {  
  3.   

jackson开发所需jar包: http://download.csdn.net/detail/dengwenwei121/8175727
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值