jackjson是目前比较好用的json框架,效率性能都很不错,也不像net.sft.json 那样依赖大量jar.
对于返回json数据有注解可以很方便的进行操作.
如下格式化日期,timezone一定要加,不然会少8h
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "PRC")
DateTimeFormat是spring的注解,用以设置接收日期的格式,否则会出现400的错误
@DateTimeFormat( pattern = "yyyy-MM-dd")
有时候偷懒mybatis直接返回了map而不是resultMap,导致日期格式错乱
类似于 2017-02-19T16:00:00.000+0000,所以就寻求设置全局日期格式.
jackjson有全局的日期转换器,然而设置以后尴尬的发现 @JsonFormat 注解不起效了
private static final String DEFAULT_DATE_FORMAT="yyyy-MM-dd HH:mm:ss";
ObjectMapper objectMapper=new ObjectMapper();
//这个设置会覆盖字段注解
objectMapper.setDateFormat(new SimpleDateFormat(DEFAULT_DATE_FORMAT));
最终找了很多文章,通过jackjson拦截器成功解决问题,优先查找JsonFormat,获取日期格式
找不到的时候再使用DateTimeFormat,都找不到的时候使用默认格式
详细代码如下
private static final String DEFAULT_DATE_FORMAT="yyyy-MM-dd HH:mm:ss";
private final ObjectMapper objectMapper;
public JsonParserImpl() {
objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
objectMapper.setSerializationInclusion(Include.ALWAYS);
//设置null值为""
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer
public class JackJsonDateSerializer extends JsonSerializer {
private DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public JackJsonDateSerializer() {
}
public JackJsonDateSerializer(String format) {
df = new SimpleDateFormat(format);
}
public void serialize(Date arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException, JsonProcessingException {
if (null != arg0) {
arg1.writeString(this.df.format(arg0));
}
}
}
参考文章:https://blog.csdn.net/zhanngle/article/details/24123659