`
dengwenwei121
  • 浏览: 36734 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
文章分类
社区版块
存档分类
最新评论

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. publicclassName{
  2. @JsonProperty("firstName")
  3. publicString_first_name;
  4. }

结果是:

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

二、忽略属性

Java代码
  1. publicclassValue{
  2. publicintvalue1;
  3. @JsonIgnore
  4. publicintvalue2;
  5. }

结果是:

Java代码
  1. {"value1":42}

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

Java代码
  1. @JsonIgnoreProperties({"extra","uselessValue"})
  2. publicclassValue{
  3. publicintvalue;
  4. }

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

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

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

Java代码
  1. @JsonIgnoreProperties(ignoreUnknown=true)
  2. publicclassPojoWithAny{
  3. publicintvalue;
  4. }

三、指定属性类型

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

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

这样处理就可以了:

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

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

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

Java代码
  1. publicclassCtorPOJO{
  2. privatefinalint_x,_y;
  3. @JsonCreator
  4. publicCtorPOJO(@JsonProperty("x")intx,@JsonProperty("y")inty){
  5. _x=x;
  6. _y=y;
  7. }
  8. }

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

Java代码
  1. publicclassDelegatingPOJO{
  2. privatefinalint_x,_y;
  3. @JsonCreator
  4. publicDelegatingPOJO(Map<String,Object>delegate){
  5. _x=(Integer)delegate.get("x");
  6. _y=(Integer)delegate.get("y");
  7. }
  8. }

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

五、修改属性自动检测

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

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

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

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

Java代码
  1. @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)
  2. publicclassPOJOWithFields{
  3. privateintvalue;
  4. }

②想要跳过所有方法

Java代码
  1. @JsonAutoDetect(getterVisibility=JsonAutoDetect.Visibility.NONE)
  2. publicclassPOJOWithNoMethod{
  3. }

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

Java代码
  1. @JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY,getterVisibility=JsonAutoDetect.Visibility.NONE)
  2. publicclassPOJOWithOnlyField{
  3. }
jackson开发所需jar包:http://download.csdn.net/detail/dengwenwei121/8175727
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics