@JsonAutoDetect (class)
这是作用于类的annotation,主要用于指明该类使用annotation,并且可以自动侦测getter,setter,构造方法,以便生成json对象
@JsonIgnore (method/field):作用于方法或字段,用来表明,当生成json的时候忽略有该annotation的方法或字段
如题,以一个用户对象为例子:
- @Entity
- @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
- @JsonAutoDetect
- /**
- *在此标记不生成json对象的属性,这里我标记了两个属性一个hibernateLazyInitializer属性,为什么要标记这个
- *属性参考前面的博文,一个password属性,出于安全这个当然不能转换成json对象了,毕竟json是在前台调用的,
- *如果你想转换的时候忽略某个属性,可以在后面继续加上
- */
- @JsonIgnoreProperties(value={"hibernateLazyInitializer","password"})
- publicclassUser
- {
- privateLongid;
- privateStringname;
- privateStringpassword;
- privateStringemail;
- privateDatecreateAt;
- @Id
- @GeneratedValue(strategy=GenerationType.IDENTITY)
- publicLonggetId(){
- returnid;
- }
- publicvoidsetId(Longid){
- this.id=id;
- }
- /**
- *转换日期对象的输出格式,CustomDateSerializer代码参考前面的博文
- */
- @JsonSerialize(using=CustomDateSerializer.class)
- publicDategetCreateAt(){
- returncreateAt;
- }
- publicvoidsetCreateAt(DatecreateAt){
- this.createAt=createAt;
- }
- /**
- *其他的getter和setter省略
- */
- }
- @Entity
- @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
- @JsonAutoDetect
- /**
- *在此标记不生成json对象的属性,这里我标记了两个属性一个hibernateLazyInitializer属性,为什么要标记这个
- *属性参考前面的博文,一个password属性,出于安全这个当然不能转换成json对象了,毕竟json是在前台调用的,
- *如果你想转换的时候忽略某个属性,可以在后面继续加上
- */
- @JsonIgnoreProperties(value={"hibernateLazyInitializer","password"})
- publicclassUser
- {
- privateLongid;
- privateStringname;
- privateStringpassword;
- privateStringemail;
- privateDatecreateAt;
- @Id
- @GeneratedValue(strategy=GenerationType.IDENTITY)
- publicLonggetId(){
- returnid;
- }
- publicvoidsetId(Longid){
- this.id=id;
- }
- /**
- *转换日期对象的输出格式,CustomDateSerializer代码参考前面的博文
- */
- @JsonSerialize(using=CustomDateSerializer.class)
- publicDategetCreateAt(){
- returncreateAt;
- }
- publicvoidsetCreateAt(DatecreateAt){
- this.createAt=createAt;
- }
- /**
- *其他的getter和setter省略
- */
- }
至于中间的什么service,dao都大同小异就不记录了
转到struts2 看看一个用jackson返回json对象的action是如何写的
- @Namespace("/security/user")
- publicclassUserActionextendsActionSupport
- {
- @Action("list")
- publicStringlist()throwsException{
- //取得所有的用户
- List<User>list=userService.getAll();
- response=ServletActionContext.getResponse();
- //jackson
- ObjectMappermapper=newObjectMapper();
- //把取得的用户list写入response
- mapper.writeValue(response.getWriter(),list);
- returnnull;
- }
- }
- @Namespace("/security/user")
- publicclassUserActionextendsActionSupport
- {
- @Action("list")
- publicStringlist()throwsException{
- //取得所有的用户
- List<User>list=userService.getAll();
- response=ServletActionContext.getResponse();
- //jackson
- ObjectMappermapper=newObjectMapper();
- //把取得的用户list写入response
- mapper.writeValue(response.getWriter(),list);
- returnnull;
- }
- }
这样我们在浏览器访问http://yourdomain/security/user/list就可以返回一个包含所有用户信息的json数组
hibernate延时加载
因为jsonplugin用的是java的内审机制.hibernate会给被管理的pojo加入一个hibernateLazyInitializer属性,jsonplugin会把hibernateLazyInitializer也拿出来操作,并读取里面一个不能被反射操作的属性就产生了这个异常.
不过我用的是jackson来转json,所以想到了用annotation来排除hibernateLazyInitializer 这个属性
在你的pojo类声明加上:
- @JsonIgnoreProperties(value={"hibernateLazyInitializer"})
转换格式设置
近日,使用Jackson转化JSON对象的时候,显示的时候,日期始终显示不正确,输出的日期是一串数字代表的时间戳,不符合要求,所以想到Jackson应当有方法设置输出的日期格式。后来一查果然有两种方式来实现:
1.普通的方式:
默认是转成timestamps形式的,通过下面方式可以取消timestamps。
- 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".
当然也可以自定义输出格式:
- objectMapper.getSerializationConfig().setDateFormat(myDateFormat);
- objectMapper.getSerializationConfig().setDateFormat(myDateFormat);
- myDateFormat对象为java.text.DateFormat,具体使用清查javaAPI
- myDateFormat对象为java.text.DateFormat,具体使用清查javaAPI
2.annotaion的注释方式:
先定义自己需要的格式,例如:
- importjava.io.IOException;
- importjava.text.SimpleDateFormat;
- importjava.util.Date;
- importorg.codehaus.jackson.JsonGenerator;
- importorg.codehaus.jackson.JsonProcessingException;
- importorg.codehaus.jackson.map.JsonSerializer;
- importorg.codehaus.jackson.map.SerializerProvider;
- /**
- *java日期对象经过Jackson库转换成JSON日期格式化自定义类
- *@authorgodfox
- *@date2010-5-3
- */
- publicclassCustomDateSerializerextendsJsonSerializer<Date>{
- @Override
- publicvoidserialize(Datevalue,JsonGeneratorjgen,SerializerProviderprovider)throwsIOException,JsonProcessingException{
- SimpleDateFormatformatter=newSimpleDateFormat("yyyy-MM-dd");
- StringformattedDate=formatter.format(value);
- jgen.writeString(formattedDate);
- }
- }
- importjava.io.IOException;
- importjava.text.SimpleDateFormat;
- importjava.util.Date;
- importorg.codehaus.jackson.JsonGenerator;
- importorg.codehaus.jackson.JsonProcessingException;
- importorg.codehaus.jackson.map.JsonSerializer;
- importorg.codehaus.jackson.map.SerializerProvider;
- /**
- *java日期对象经过Jackson库转换成JSON日期格式化自定义类
- *@authorgodfox
- *@date2010-5-3
- */
- publicclassCustomDateSerializerextendsJsonSerializer<Date>{
- @Override
- publicvoidserialize(Datevalue,JsonGeneratorjgen,SerializerProviderprovider)throwsIOException,JsonProcessingException{
- SimpleDateFormatformatter=newSimpleDateFormat("yyyy-MM-dd");
- StringformattedDate=formatter.format(value);
- jgen.writeString(formattedDate);
- }
- }
然后在你的POJO上找到日期的get方法
- @JsonSerialize(using=CustomDateSerializer.class)
- publicDategetCreateAt(){
- returncreateAt;
- }