`
zzc1684
  • 浏览: 1191787 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

简单的使用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. }  
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. }  

 

至于中间的什么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. }  
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. }  

 这样我们在浏览器访问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 );  
Java代码  收藏代码
  1. 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);  
Java代码  收藏代码
  1. objectMapper.getSerializationConfig().setDateFormat(myDateFormat);  
Java代码 复制代码
  1. myDateFormat对象为java.text.DateFormat,具体使用清查java API  
Java代码
  1. myDateFormat对象为java.text.DateFormat,具体使用清查java API  
Java代码  收藏代码
  1. 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. }  
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. }  

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

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

 

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

分享到:
评论

相关推荐

    boot:常用的工具或者服务

    boot模块boot-parent项目依赖管理boot-dependenciesboot模块管理,其他项目可以导入pom使用boot-annotation常用的自定义注解,比如@Id,@Table等boot-util常用工具类,比如集合工具,Jackson工具类,日期工具类等boot...

    auto-value-jackson:AutoValue Extension添加了对Jackson DeSerializer的支持

    [反序列化简单类 使用类型参数对属性进行反序列化 通过@JsonProperty支持自定义json名称 多态[反]序列化 能够添加默认值 通过@JsonSerialize / @JsonDeserialize定制的[de] serializers 支持@JsonIgnore 一...

    java开源包8

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    JAVA上百实例源码以及开源项目源代码

     Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法:  可直接输入文件名或网络地址,但必需事先连入网络。 Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,...

    java开源包1

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包11

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包2

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包3

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包6

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包5

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包10

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包4

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包7

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包9

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    java开源包101

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    Java资源包01

    Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...

    JAVA上百实例源码以及开源项目

     Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法:  可直接输入文件名或网络地址,但必需事先连入网络。 Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,...

    kripton:一个用于Android平台的JavaKotlin库,用于管理bean在SQLite,SharedPreferences,JSON,XML,Properties,Yaml,CBOR中的持久性

    克里普顿持久性图书馆Kripton是一个用于Android平台的Java库,它提供了一种简单而统一的方法,即通过注释和接口来管理各种口味的Java类的持久性。 克里普顿可以为您做: 生成将POJO持久存储在SQLite数据库中所需的...

Global site tag (gtag.js) - Google Analytics