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
相关文章
- Jackson设置JSON的日期格式
- SVN设置忽略文件列表以及丢失了预定增加的文件解决方法
- 如何为Jackson JSON设置格式化程序?
- 如何在Java中设置符合用户操作系统设置的日期和时间格式
- mysql数据库插入中文以及乱码问题解决(统一设置为utf-8)格式
- 使用opencv设置图像的格式以及帧率
- 利用PHPExcel导出Excel并设置Excel格式以及数据源
- SpringMVC在使用Jackson2时关于日期类型格式化的问题
- 26Flutter 日期 和时间戳/格式化日期库/flutter异步/ 官方自带日期组件showDatePicker、时间组件showTimePicker以及国际化
- 如何确定区域设置的日期格式是月/日还是日/月?