注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

让一切都逝去吧

排骨炖泥菜/猪肝炒苹果/鱼籽狗肉汤/狗头薏米汤

 
 
 

日志

 
 

jackson设置日期格式以及忽略  

2013-08-30 15:28:39|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
      jacksonz换行json格式中,默认将时间输出为这样的数字了:1377845196919。简单的处理方式是,在ObjectMapper上设置。使用的时候我们一般会创建一个com.fasterxml.jackson.databind.ObjectMapper对象,使用ObjectMapper对象设置日期格式,然后所有日期类型数据都生效。
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
有的资料使用下面这个方法
objectMapper.getSerializationConfig().setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
我的例子中使用objectMapper.setDateFormat是成功的。
      除了统一设置,还有介绍一种方式
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);  
    }
}
在需转换的类中
@JsonSerialize(using = CustomDateSerializer.class)  
public Date getCreateAt() {  
    return createAt;  
}
这样没试过,每个类上面设置很麻烦。不过如果有些地方需要特殊的格式可以使用这个。

      手头上是有个webservice调用的客户端代码,需要将其中fastjson包替换成jackson。其中有好多类的属性上标有
@JsonField(name = 'xxx')
@XmlSchemaType
JsonField是fastjson中的注解,可以重命名json键值。如果同时支持xml和json,需转换成的键值名一样,但与类属性名称不一样,比如
private String aaa; 在xml中要是<Aaa>,json中要是"Add" : xxx。
这个时候直接标注@XmlElement(name = "Aaa")就可以了。jackson也支持jaxb的注解@XmlElement,可以正常转换。但fastjson不能识别@XmlElement,必须使用@JsonField。如果json中的键值与xml中的不一样,那就只能xml和json分别标注了,jackson也有对应的注解@JsonProperty。(个人觉得出现上面那些情况纯属蛋疼,但有时确实会碰到。)

让jackson支持jaxb注解的配置
objectMapper.registerModule(new JaxbAnnotationModule());
为null的属性值不映射
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);//@JsonInclude(Include.NON_NULL)
排序
objectMapper.enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);
Feature that determines whether Map entries with null values are to be serialized (true) or not (false)
objectMapper.disable(SerializationFeature.WRITE_NULL_MAP_VALUES);
有属性不能映射的时候不报错
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

      json转换时忽略掉某些属性
@JsonIgnoreProperties(ignoreUnknown = true)  
public class NumberOwnership {  
   
    @Override  
    @JsonIgnore  
    public String getId() {  
        return super.getId();  
    }  
    ...
}
@JsonIgnoreProperties(ignoreUnknown = true)  可以忽略掉从JSON(由于在应用中没有完全匹配的POJO)中获得的所有“多余的”属性。
忽略掉某些从JSON数据中得到的属性,可以使用: 
@JsonIgnoreProperties({ "extra", "uselessValue" }) 
public class Value { 
  public int value; 
}
这样就能够处理像如下所示的JSON数据: 
{ "value" : 42, "extra" : "fluffy", "uselessValue" : -13 } 


//@JsonIgnoreProperties({"birthday","name"}) 可以自定忽略属性  
  
@JsonAutoDetect(getterVisibility=Visibility.PUBLIC_ONLY,   
fieldVisibility=Visibility.ANY,   
isGetterVisibility=Visibility.ANY)  
public class User {
...
}

      也可以统一设置过滤器排除,创建了过滤器后通过这个方法设置:objectMapper.setFilters(...)。

      fastjson曾经号称是最快的json转换包,不过那还是jackson版本为1的时候。现在jackson版本升到2了,于是将fastjson1.1.36和jackson2.2.3简单测试了一下,jackson2.2.3一直花费时间大约节省20~30%。只是比较了一个方法,没有全面参考价值,目前已经确认使用jackson,就不考虑这么多了。这个有个对比,无聊的时候开一关注下:
  评论这张
 
阅读(13714)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017