jackson框架的使用-annotation(注解)、属性的过滤

@JsonAutoDetect (class)
这是作用于类的annotation,主要用于指明该类使用annotation,并且可以自动侦测getter,setter,构造方法,以便生成json对象
@JsonIgnore (method/field):作用于方法或字段,用来表明,当生成json的时候忽略有该annotation的方法或字段
@JsonIgnoreProperties  (value = { "hibernateLazyInitializer"  ,  "password"  }) ,主要用于过滤掉一些不需要的属性

代码:
@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省略   
    */     
}   

@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 ;    
    }    
}   


hibernate延时加载


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

不过我用的是jackson来转json,所以想到了用annotation来排除hibernateLazyInitializer 这个属性
在你的pojo类声明加上:
@JsonIgnoreProperties  (value={ "hibernateLazyInitializer"  })   


转换格式设置


近日,使用Jackson转化JSON对象的时候,显示的时候,日期始终显示不正确,输出的日期是一串数字代表的时间戳,不符合要求,所以想到Jackson应当有方法设置输出的日期格式。后来一查果然有两种方式来实现:
1.普通的方式:
默认是转成timestamps形式的,通过下面方式可以取消timestamps。 这样将使时间生成使用所谓的use a [ ISO-8601]-compliant notation, 输出类似如下格式的时间: "1970-01-01T00:00:00.000+0000

2.objectMapper.getSerializationConfig().setDateFormat(myDateFormat);   myDateFormat对象为java.text.DateFormat,具体使用清查java API  

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);    
        }    
}  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值