jackson设置日期格式以及忽略

时间:2022-05-25 14:01:46
  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 } 


这里摘自:http://wong-john.iteye.com/blog/1753402


//@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,就不考虑这么多了。这个有个对比,无聊的时候开一关注下:
https://github.com/eishay/jvm-serializers/wiki