JackJsonグローバル日付とローカル日付(グローバルに日付フォーマットを設定し、JsonFormatを使用可能にします)

3820 ワード

jackjsonは現在使いやすいjsonフレームワークであり、効率性能もnet.sft.jsonは大量jarに依存している.
jsonデータを返す注釈があると操作が容易である.
次のフォーマット日、timezoneは必ず追加しなければなりません.そうしないと8 h少なくなります.
 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "PRC")
 
DateTimeFormatはspringの注記で、受信日のフォーマットを設定します.そうしないと400のエラーが発生します.
@DateTimeFormat( pattern = "yyyy-MM-dd")
 
サボってmybatisがresultMapではなくmapに直接戻った場合、日付フォーマットが乱れてしまうことがあります
2017-02-19 T 16: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