`
hypgr
  • 浏览: 276817 次
社区版块
存档分类
最新评论

简单的使用jackson的annotation

阅读更多

@JsonAutoDetect (class)

这是作用于类的annotation,主要用于指明该类使用annotation,并且可以自动侦测getter,setter,构造方法,以便生成json对象

@JsonIgnore (method/field):作用于方法或字段,用来表明,当生成json的时候忽略有该annotation的方法或字段

 

如题,以一个用户对象为例子:

 

Java代码 复制代码
  1. @Entity   
  2. @Cache (usage = CacheConcurrencyStrategy.READ_WRITE)   
  3. @JsonAutoDetect   
  4. /**  
  5. * 在此标记不生成json对象的属性,这里我标记了两个属性一个hibernateLazyInitializer属性,为什么要标记这个  
  6. * 属性参考前面的博文,一个password属性,出于安全这个当然不能转换成json对象了,毕竟json是在前台调用的,  
  7. * 如果你想转换的时候忽略某个属性,可以在后面继续加上  
  8. */   
  9. @JsonIgnoreProperties (value = { "hibernateLazyInitializer" "password" })   
  10. public   class  User   
  11. {   
  12.      private  Long id;   
  13.      private  String name;   
  14.      private  String password;   
  15.      private  String email;   
  16.      private  Date createAt;   
  17.      @Id   
  18.      @GeneratedValue (strategy = GenerationType.IDENTITY)   
  19.      public  Long getId() {   
  20.          return  id;   
  21.     }   
  22.   
  23.      public   void  setId(Long id) {   
  24.          this .id = id;   
  25.     }   
  26.      /**  
  27.     * 转换日期对象的输出格式,CustomDateSerializer 代码参考前面的博文      
  28.         */   
  29.      @JsonSerialize (using = CustomDateSerializer. class )   
  30.      public  Date getCreateAt() {   
  31.              return  createAt;   
  32.     }   
  33.   
  34.      public   void  setCreateAt(Date createAt) {   
  35.              this .createAt = createAt;   
  36.     }   
  37.      /**  
  38.     * 其他的getter和setter省略  
  39.     */   
  40. }  
Java代码
  1. @Entity   
  2. @Cache (usage = CacheConcurrencyStrategy.READ_WRITE)  
  3. @JsonAutoDetect   
  4. /**  
  5. * 在此标记不生成json对象的属性,这里我标记了两个属性一个hibernateLazyInitializer属性,为什么要标记这个  
  6. * 属性参考前面的博文,一个password属性,出于安全这个当然不能转换成json对象了,毕竟json是在前台调用的,  
  7. * 如果你想转换的时候忽略某个属性,可以在后面继续加上  
  8. */   
  9. @JsonIgnoreProperties (value = { "hibernateLazyInitializer" "password" })  
  10. public   class  User  
  11. {  
  12.     private  Long id;  
  13.     private  String name;  
  14.     private  String password;  
  15.     private  String email;  
  16.     private  Date createAt;  
  17.     @Id   
  18.     @GeneratedValue (strategy = GenerationType.IDENTITY)  
  19.     public  Long getId() {  
  20.         return  id;  
  21.     }  
  22.   
  23.     public   void  setId(Long id) {  
  24.         this .id = id;  
  25.     }  
  26.     /**  
  27.     * 转换日期对象的输出格式,CustomDateSerializer 代码参考前面的博文      
  28.         */   
  29.     @JsonSerialize (using = CustomDateSerializer. class )  
  30.     public  Date getCreateAt() {  
  31.             return  createAt;  
  32.     }  
  33.   
  34.     public   void  setCreateAt(Date createAt) {  
  35.             this .createAt = createAt;  
  36.     }  
  37.     /**  
  38.     * 其他的getter和setter省略  
  39.     */   
  40. }  
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JsonAutoDetect
/**
* 在此标记不生成json对象的属性,这里我标记了两个属性一个hibernateLazyInitializer属性,为什么要标记这个
* 属性参考前面的博文,一个password属性,出于安全这个当然不能转换成json对象了,毕竟json是在前台调用的,
* 如果你想转换的时候忽略某个属性,可以在后面继续加上
*/
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "password"})
public class User
{
	private Long id;
	private String name;
	private String password;
	private String email;
	private Date createAt;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}
	/**
	* 转换日期对象的输出格式,CustomDateSerializer 代码参考前面的博文	
        */
	@JsonSerialize(using = CustomDateSerializer.class)
	public Date getCreateAt() {
			return createAt;
	}

	public void setCreateAt(Date createAt) {
			this.createAt = createAt;
	}
	/**
	* 其他的getter和setter省略
	*/
}

 

至于中间的什么service,dao都大同小异就不记录了

转到struts2 看看一个用jackson返回json对象的action是如何写的

Java代码 复制代码
  1. @Namespace ( "/security/user" )   
  2. public   class  UserAction  extends  ActionSupport   
  3. {   
  4.      @Action ( "list" )   
  5.      public  String list()  throws  Exception {   
  6.              // 取得所有的用户   
  7.             List<User> list = userService.getAll();   
  8.             response = ServletActionContext.getResponse();   
  9.              // jackson   
  10.             ObjectMapper mapper =  new  ObjectMapper();   
  11.              // 把取得的用户list写入response   
  12.             mapper.writeValue(response.getWriter(), list);   
  13.              return   null ;   
  14.     }   
  15. }  
Java代码
  1. @Namespace ( "/security/user" )  
  2. public   class  UserAction  extends  ActionSupport  
  3. {  
  4.     @Action ( "list" )  
  5.     public  String list()  throws  Exception {  
  6.             // 取得所有的用户   
  7.             List<User> list = userService.getAll();  
  8.             response = ServletActionContext.getResponse();  
  9.             // jackson   
  10.             ObjectMapper mapper = new  ObjectMapper();  
  11.             // 把取得的用户list写入response   
  12.             mapper.writeValue(response.getWriter(), list);  
  13.             return   null ;  
  14.     }  
  15. }  
@Namespace("/security/user")
public class UserAction extends ActionSupport
{
	@Action("list")
	public String list() throws Exception {
			// 取得所有的用户
			List<User> list = userService.getAll();
			response = ServletActionContext.getResponse();
			// jackson
			ObjectMapper mapper = new ObjectMapper();
			// 把取得的用户list写入response
			mapper.writeValue(response.getWriter(), list);
			return null;
	}
}

 这样我们在浏览器访问http://yourdomain/security/user/list 就可以返回一个包含所有用户信息的json数组

 

hibernate延时加载

因为jsonplugin用的是java的内审机制.hibernate会给被管理的pojo加入一个 hibernateLazyInitializer属性,jsonplugin会把hibernateLazyInitializer也拿出来操作,并读 取里面一个不能被反射操作的属性就产生了这个异常.  

 

不过我用的是jackson来转json,所以想到了用annotation来排除hibernateLazyInitializer 这个属性

在你的pojo类声明加上:

 

Java代码 复制代码
  1. @JsonIgnoreProperties (value={ "hibernateLazyInitializer" })  

 

转换格式设置

近日,使用Jackson转化JSON对象的时候,显示的时候,日期始终显示不正确,输出的日期是一串数字代表的时间戳,不符合要求,所以想到Jackson应当有方法设置输出的日期格式。后来一查果然有两种方式来实现:

1.普通的方式:

默认是转成timestamps形式的,通过下面方式可以取消timestamps。

Java代码 复制代码
  1. objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS,  false );  
Java代码
  1. objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS,  false );  
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);

 这样将使时间生成使用所谓的use a [ISO-8601 ]-compliant notation, 输出类似如下格式的时间: "1970-01-01T00:00:00.000+0000".

当然也可以自定义输出格式:

Java代码 复制代码
  1. objectMapper.getSerializationConfig().setDateFormat(myDateFormat);  
Java代码
  1. objectMapper.getSerializationConfig().setDateFormat(myDateFormat);  
objectMapper.getSerializationConfig().setDateFormat(myDateFormat);
Java代码 复制代码
  1. myDateFormat对象为java.text.DateFormat,具体使用清查java API  
Java代码
  1. myDateFormat对象为java.text.DateFormat,具体使用清查java API  
myDateFormat对象为java.text.DateFormat,具体使用清查java API

2.annotaion的注释方式:

先定义自己需要的格式,例如:

Java代码 复制代码
  1. import  java.io.IOException;   
  2. import  java.text.SimpleDateFormat;   
  3. import  java.util.Date;   
  4. import  org.codehaus.jackson.JsonGenerator;   
  5. import  org.codehaus.jackson.JsonProcessingException;   
  6. import  org.codehaus.jackson.map.JsonSerializer;   
  7. import  org.codehaus.jackson.map.SerializerProvider;   
  8.   
  9. /**  
  10.  *  java日期对象经过Jackson库转换成JSON日期格式化自定义类  
  11.  * @author godfox  
  12.  * @date 2010-5-3  
  13.  */   
  14. public   class  CustomDateSerializer  extends  JsonSerializer<Date> {   
  15.   
  16.          @Override   
  17.          public   void  serialize(Date value, JsonGenerator jgen, SerializerProvider provider)  throws  IOException, JsonProcessingException {   
  18.                 SimpleDateFormat formatter =  new  SimpleDateFormat( "yyyy-MM-dd" );   
  19.                 String formattedDate = formatter.format(value);   
  20.                 jgen.writeString(formattedDate);   
  21.         }   
  22. }  
Java代码
  1. import  java.io.IOException;  
  2. import  java.text.SimpleDateFormat;  
  3. import  java.util.Date;  
  4. import  org.codehaus.jackson.JsonGenerator;  
  5. import  org.codehaus.jackson.JsonProcessingException;  
  6. import  org.codehaus.jackson.map.JsonSerializer;  
  7. import  org.codehaus.jackson.map.SerializerProvider;  
  8.   
  9. /**  
  10.  *  java日期对象经过Jackson库转换成JSON日期格式化自定义类  
  11.  * @author godfox  
  12.  * @date 2010-5-3  
  13.  */   
  14. public   class  CustomDateSerializer  extends  JsonSerializer<Date> {  
  15.   
  16.         @Override   
  17.         public   void  serialize(Date value, JsonGenerator jgen, SerializerProvider provider)  throws  IOException, JsonProcessingException {  
  18.                 SimpleDateFormat formatter = new  SimpleDateFormat( "yyyy-MM-dd" );  
  19.                 String formattedDate = formatter.format(value);  
  20.                 jgen.writeString(formattedDate);  
  21.         }  
  22. }  
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;

/**
 *  java日期对象经过Jackson库转换成JSON日期格式化自定义类
 * @author godfox
 * @date 2010-5-3
 */
public class CustomDateSerializer extends JsonSerializer<Date> {

        @Override
        public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                String formattedDate = formatter.format(value);
                jgen.writeString(formattedDate);
        }
}

 然后在你的POJO上找到日期的get方法

Java代码 复制代码
  1. @JsonSerialize (using = CustomDateSerializer. class )   
  2.         public  Date getCreateAt() {   
  3.                 return  createAt;   
  4.        }  
 

 

更多可以参考:http://wiki.fasterxml.com/JacksonAnnotations

分享到:
评论
1 楼 elvishehai 2011-12-25  
能不能给个完整点的例子呀,我一直都没有试成功过,

相关推荐

    jackson-core所需的三个包;jackson-databind.jar,jackson-annotations.jar,jackson-core.jar

    它扩展了jackson-core,提供了对Java Bean属性的自动映射,使得我们可以通过简单的注解将类实例转换为JSON,反之亦然。 3. **jackson-annotations.jar**:包含了一系列的注解,这些注解可以用来配置Jackson如何序列...

    最新的高性能 JSON 处理jackson-2.9.2.jar下载

    Jackson是Java领域中广泛使用...总的来说,Jackson-2.9.2是一个强大且高效的JSON处理库,它为Java开发者提供了丰富的工具和选项来处理JSON数据,无论是在简单的数据交换还是在复杂的应用场景中,都能展现出强大的威力。

    Jackson包(适合spring4.X版本的使用)

    总之,Jackson在Spring 4.X中扮演着重要角色,它使得JSON处理变得简单而高效。理解其组件和使用方法,有助于提升项目的开发效率和质量。在实际项目中,应优先使用最新版本的`jackson-databind`、`jackson-core`和`...

    Jackson的简单用法

    以下是一个简单的例子,展示了如何使用`ObjectMapper`将一个Java对象转换为JSON字符串: ```java import com.fasterxml.jackson.databind.ObjectMapper; public class User { private String name; private int ...

    jackson1.9.13&2.9.2

    4. `fasterxml.jackson.jaxrs`模块:提供JAX-RS(Java API for RESTful Web Services)集成,使得在REST服务中使用Jackson变得简单。 5. `fasterxml.jackson.databind.module`模块:允许用户自定义模块,以便扩展...

    Jackson2.2.3.rar

    创建一个简单的Java对象,如`User`,然后使用`ObjectMapper`进行序列化和反序列化操作: ```java public class User { private String name; private int age; // getters, setters, constructors... } ...

    Jackson.rar

    总的来说,Jackson是SpringMVC中处理JSON数据的关键工具,它使得在Java后端和前端之间交换数据变得更加简单和高效。这个名为"Jackson.rar"的压缩包可能是为了方便开发者快速在项目中集成不同版本的Jackson,以适应...

    jackson--ajax驱动包.rar

    Jackson是Java领域中广泛使用的JSON库,主要用于处理JSON数据,包括序列化和反序列化。在SpringMVC框架中,Jackson扮演着重要角色,它允许我们通过Ajax请求进行JSON数据的交互,极大地提高了Web应用的响应速度和用户...

    Android JackSon解析JSON

    本文将深入探讨如何在Android中使用Jackson进行JSON解析,并通过手打Demo来展示其实用性和高效性。 首先,我们需要引入Jackson库。在`build.gradle`文件中添加依赖: ```groovy dependencies { implementation '...

    jackson-2.9.7jar包

    3. **fasterxml.jackson.annotation**: 这个模块包含了各种注解,如`@JsonProperty`、`@JsonInclude`和`@JsonAutoDetect`等,这些注解允许开发者精细控制JSON序列化和反序列化的逻辑,比如忽略某些属性、自定义字段...

    jackson-core-asl-1.9.8.jar+jackson-mapper-asl-1.9.8.jar下载

    总之,`jackson-core-asl-1.9.8.jar`和`jackson-mapper-asl-1.9.8.jar`是Jackson库的旧版组件,它们在Spring MVC中与`@ResponseBody`和`&lt;mvc:annotation-driven /&gt;`结合使用,提供了JSON数据的自动序列化和反序列化...

    jackson-all-1.9.11.jar

    Jackson Data Bind模块,即Jackson ObjectMapper,是其最常用的部分,它提供了简单易用的API来实现Java对象与JSON之间的映射。例如,你可以使用`ObjectMapper.readTree()`方法将JSON字符串转换为JsonNode树形结构,...

    Jackson实现Object对象与Json字符串的互转

    3. `fasterxml.jackson.annotation`:包含了一系列的注解,用于定制序列化和反序列化的行为。 ### 序列化:Object到Json 序列化是指将Java对象转换为JSON字符串的过程。Jackson提供了`ObjectMapper`类来实现这一...

    SpringMVC源码总结(三)mvc:annotation-driven和mvc:message-converters简单介绍

    在Spring MVC框架中,`mvc:annotation-driven`和`mvc:message-converters`是两个非常重要的元素,它们在处理基于注解的控制器和数据转换方面起着关键作用。本篇文章将深入探讨这两个组件的工作原理以及如何在实际...

    jackson2.7.4jar包

    它可以将Java对象直接映射到JSON,反之亦然,使得JSON数据和Java POJO(Plain Old Java Object)之间的转换变得简单。`ObjectMapper`类是这个模块的核心,负责执行实际的转换操作。 3. **jackson-anno**:即Jackson...

    struts2annotation json

    - Struts2的JSON插件提供了一种简单的方式来序列化和反序列化Java对象到JSON格式,无需额外的库如Gson或Jackson。 - 要启用JSON插件,首先需要在struts.xml配置文件中引入依赖,或者在pom.xml中添加相应的Maven...

    JSON中fastjson、jackson、gson如何选择.docx

    jackson 使用了 Java 语言的Annotation 机制,来映射 JSON 数据和 Java 对象。 gson 是谷歌出品的 JSON 解析器,具有高性能和高可扩展性的特点。gson 使用了 Java 语言的反射机制,来映射 JSON 数据和 Java 对象。 ...

    jackson-core-asl-1.9.8.jar+jackson-mapper-asl-1.9.8.jar 下载

    2. 在Spring的配置文件中,使用`&lt;mvc:annotation-driven&gt;` 配置元素启用基于注解的控制器支持,Spring会自动检测并使用Jackson库进行JSON转换。 使用示例: ```java import org.springframework.web.bind....

    jackson*2.5.3资源包

    杰克逊(Jackson)是Java领域中广泛使用的JSON处理库,它的版本2.5.3在本资源包中包含了两个核心组件:`jackson-jr-objects-2.5.3.jar` 和 `jackson-core-2.5.3.jar`。 1. **Jackson-jr-objects-2.5.3.jar** 这个...

    使用Jackson来实现Java对象与JSON的相互转换的教程

    为了实现这一转换,Java开发者们经常使用Jackson这一功能强大的库。 ### 知识点一:什么是Jackson? Jackson是一个流行的Java库,专门用于处理JSON格式数据。它是以Java对象模型为基础,将Java对象序列化(转换为...

Global site tag (gtag.js) - Google Analytics