初步了解jackson,简单的使用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. publicclassUser
  11. {
  12. privateLongid;
  13. privateStringname;
  14. privateStringpassword;
  15. privateStringemail;
  16. privateDatecreateAt;
  17. @Id
  18. @GeneratedValue(strategy=GenerationType.IDENTITY)
  19. publicLonggetId(){
  20. returnid;
  21. }
  22. publicvoidsetId(Longid){
  23. this.id=id;
  24. }
  25. /**
  26. *转换日期对象的输出格式,CustomDateSerializer代码参考前面的博文
  27. */
  28. @JsonSerialize(using=CustomDateSerializer.class)
  29. publicDategetCreateAt(){
  30. returncreateAt;
  31. }
  32. publicvoidsetCreateAt(DatecreateAt){
  33. this.createAt=createAt;
  34. }
  35. /**
  36. *其他的getter和setter省略
  37. */
  38. }
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. publicclassUser
  11. {
  12. privateLongid;
  13. privateStringname;
  14. privateStringpassword;
  15. privateStringemail;
  16. privateDatecreateAt;
  17. @Id
  18. @GeneratedValue(strategy=GenerationType.IDENTITY)
  19. publicLonggetId(){
  20. returnid;
  21. }
  22. publicvoidsetId(Longid){
  23. this.id=id;
  24. }
  25. /**
  26. *转换日期对象的输出格式,CustomDateSerializer代码参考前面的博文
  27. */
  28. @JsonSerialize(using=CustomDateSerializer.class)
  29. publicDategetCreateAt(){
  30. returncreateAt;
  31. }
  32. publicvoidsetCreateAt(DatecreateAt){
  33. this.createAt=createAt;
  34. }
  35. /**
  36. *其他的getter和setter省略
  37. */
  38. }

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

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

Java代码 复制代码
  1. @Namespace("/security/user")
  2. publicclassUserActionextendsActionSupport
  3. {
  4. @Action("list")
  5. publicStringlist()throwsException{
  6. //取得所有的用户
  7. List<User>list=userService.getAll();
  8. response=ServletActionContext.getResponse();
  9. //jackson
  10. ObjectMappermapper=newObjectMapper();
  11. //把取得的用户list写入response
  12. mapper.writeValue(response.getWriter(),list);
  13. returnnull;
  14. }
  15. }
Java代码 收藏代码
  1. @Namespace("/security/user")
  2. publicclassUserActionextendsActionSupport
  3. {
  4. @Action("list")
  5. publicStringlist()throwsException{
  6. //取得所有的用户
  7. List<User>list=userService.getAll();
  8. response=ServletActionContext.getResponse();
  9. //jackson
  10. ObjectMappermapper=newObjectMapper();
  11. //把取得的用户list写入response
  12. mapper.writeValue(response.getWriter(),list);
  13. returnnull;
  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);

这样将使时间生成使用所谓的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. myDateFormat对象为java.text.DateFormat,具体使用清查javaAPI
Java代码 收藏代码
  1. myDateFormat对象为java.text.DateFormat,具体使用清查javaAPI

2.annotaion的注释方式:

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

Java代码 复制代码
  1. importjava.io.IOException;
  2. importjava.text.SimpleDateFormat;
  3. importjava.util.Date;
  4. importorg.codehaus.jackson.JsonGenerator;
  5. importorg.codehaus.jackson.JsonProcessingException;
  6. importorg.codehaus.jackson.map.JsonSerializer;
  7. importorg.codehaus.jackson.map.SerializerProvider;
  8. /**
  9. *java日期对象经过Jackson库转换成JSON日期格式化自定义类
  10. *@authorgodfox
  11. *@date2010-5-3
  12. */
  13. publicclassCustomDateSerializerextendsJsonSerializer<Date>{
  14. @Override
  15. publicvoidserialize(Datevalue,JsonGeneratorjgen,SerializerProviderprovider)throwsIOException,JsonProcessingException{
  16. SimpleDateFormatformatter=newSimpleDateFormat("yyyy-MM-dd");
  17. StringformattedDate=formatter.format(value);
  18. jgen.writeString(formattedDate);
  19. }
  20. }
Java代码 收藏代码
  1. importjava.io.IOException;
  2. importjava.text.SimpleDateFormat;
  3. importjava.util.Date;
  4. importorg.codehaus.jackson.JsonGenerator;
  5. importorg.codehaus.jackson.JsonProcessingException;
  6. importorg.codehaus.jackson.map.JsonSerializer;
  7. importorg.codehaus.jackson.map.SerializerProvider;
  8. /**
  9. *java日期对象经过Jackson库转换成JSON日期格式化自定义类
  10. *@authorgodfox
  11. *@date2010-5-3
  12. */
  13. publicclassCustomDateSerializerextendsJsonSerializer<Date>{
  14. @Override
  15. publicvoidserialize(Datevalue,JsonGeneratorjgen,SerializerProviderprovider)throwsIOException,JsonProcessingException{
  16. SimpleDateFormatformatter=newSimpleDateFormat("yyyy-MM-dd");
  17. StringformattedDate=formatter.format(value);
  18. jgen.writeString(formattedDate);
  19. }
  20. }

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

Java代码 复制代码
  1. @JsonSerialize(using=CustomDateSerializer.class)
  2. publicDategetCreateAt(){
  3. returncreateAt;
  4. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值