JackJson全局日期和局部日期(全局设置日期格式,同时使JsonFormat依旧可以使用)

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(){
        @Override
        public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
            gen.writeString("");
        }
    });
    //这个设置会覆盖字段注解
    objectMapper.setDateFormat(new SimpleDateFormat(DEFAULT_DATE_FORMAT));
    //设置全局日期格式同时允许 DateTimeFormat 注解,默认取JsonFormat
    //其次取DateTimeFormat,都取不到用默认的
    objectMapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
        @Override
        public Object findSerializer(Annotated a) {
            if(a instanceof AnnotatedMethod) {
                AnnotatedElement m=a.getAnnotated();
                JsonFormat an=m.getAnnotation(JsonFormat.class);
                DateTimeFormat dtm=m.getAnnotation(DateTimeFormat.class);
                if(an!=null) {
                    if(!DEFAULT_DATE_FORMAT.equals(an.pattern())) {
                        return new JackJsonDateSerializer(an.pattern());
                    }
                }else if(dtm!=null){
                    if(!DEFAULT_DATE_FORMAT.equals(dtm.pattern())) {
                        return new JackJsonDateSerializer(dtm.pattern());
                    }
                }
            }
            return super.findSerializer(a);
        }
    });
    SimpleModule simpleModule = new SimpleModule();
    simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
    simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
    simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
    objectMapper.registerModule(simpleModule);
}
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

你可能感兴趣的:(JackJson全局日期和局部日期(全局设置日期格式,同时使JsonFormat依旧可以使用))