FastJson配置グローバルLocal DateTimeプロローグ

31707 ワード

最近仕事でJDK 1.8 timeバッグを使って、だんだん前のDate類に取って代わって、以前に比べて、timeカバンのAPIは確かに使いやすくなりました.
しかし、ちょっと卵が痛いところはLocalDateTimeがISO 8601規格をサポートしているところです.即ち、「2018-10 T 05:51:31.94 Z」です.MVCでは、習慣的に[yyy-M-dd HH:mm:ss]を使います.幸いSpringに注釈が付いています.例えば:@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss) private LocalDateTime ldt; @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date パラメータは、パラメータまたはパラメータエンティティの属性上で@DateTimeFormatを使用することができます.パラメータについては、bodyではFormaterやConverterをカスタマイズすることで、インターネットにもたくさんあります.ここでコードを提供します.@Configuration public class LocalDateTimeFormatConfig { @Bean public Formatter<LocalDate> localDateFormatter() { return new Formatter<LocalDate>() { @Override public @Nullable String print(@Nullable LocalDate object, @Nullable Locale locale) { if (Objects.isNull(object)){ return null; } return object.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); } @Override public @Nullable LocalDate parse(@Nullable String text, @Nullable Locale locale) { if (!StringUtils.hasText(text)) { return null; } return LocalDate.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd")); } }; } @Bean public Formatter<LocalDateTime> localDateTimeFormatter() { return new Formatter<LocalDateTime>() { @Override public @Nullable String print(@Nullable LocalDateTime object, @Nullable Locale locale) { if (Objects.isNull(object)){ return null; } return object.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } @Override public @Nullable LocalDateTime parse(@Nullable String text, @Nullable Locale locale) { if (!StringUtils.hasText(text)) { return null; } return LocalDateTime.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } }; } @Bean public Formatter<LocalTime> localTimeFormatter() { return new Formatter<LocalTime>() { @Override public @Nullable String print(@Nullable LocalTime object, @Nullable Locale locale) { if (Objects.isNull(object)){ return null; } return object.format(DateTimeFormatter.ofPattern("HH:mm:ss")); } @Override public @Nullable LocalTime parse(@Nullable String text, @Nullable Locale locale) { if (!StringUtils.hasText(text)) { return null; } return LocalTime.parse(text, DateTimeFormatter.ofPattern("HH:mm:ss")); } }; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 public class LocalDateTimeConvertConfig { private String dateTimePattern = "yyyy-MM-dd HH:mm:ss"; private String datePattern = "yyyy-MM-dd"; @Bean public Converter<String, LocalDateTime> LocalDateTimeConvert() { return source -> { DateTimeFormatter df = DateTimeFormatter.ofPattern(dateTimePattern); LocalDateTime date = null; try { date = LocalDateTime.parse(source, df); } catch (Exception e) { e.printStackTrace(); } return date; }; } @Bean public Converter<String, LocalDate> localDateConverter() { return source -> { DateTimeFormatter df = DateTimeFormatter.ofPattern(datePattern); LocalDate date = null; try { date = LocalDate.parse(source,df); }catch (Exception e){ e.printStackTrace(); } return date; }; } // JackSon LocalDateTime, FastJso, @Bean public LocalDateTimeSerializer localDateTimeDeserializer() { return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimePattern)); } @Bean public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer()); } } ここで言う問題は現在の作業項目で発生した問題です.使用するFastJsonはMVCのデフォルトのJacksonではなく、プログレッシブLocalDateTimeがフロントエンドに出力された時は、「2018-10 T 05:31.94 Z」です.出力したいのはyyyy-M-dd HH:mm:ssフォーマットです.私達は同様に注釈を使って解決できます.FastJsonの@JSONField(format=「yyy-M-dd HH:mm:ss」)を使って、特別な順序を必要とするメンバーの属性について.
注釈の使用を減らすために、FastJsonにデフォルトでロカDateTime類を導入してもいいですか?まず恒例のFastJsonfigを祭ります. FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures( SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, ... SerializerFeature.WriteNullStringAsEmpty); fastJsonConfig.setCharset(Charset.forName("utf-8")); ... Value Filterを使う:ValueFilter valueFilter = (o, s, o1) -> { if (null == o1) { o1 = ""; } if (o1 instanceof LocalDateTime){ o1 = ((LocalDateTime) o1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } return o1; }; fastJsonConfig.setSerializeFilters(valueFilter); // , , o1 , LocalDateTime o1 String o1, LocalDateTime , LocalDateTime fastJsonfigのDateFormatを指定します.fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); ... // , , @JSONField format , Date ,LocalDateTime ,LocalDate 。( ) カスタムLocalDateTimeSerializerはObject Serializerインターフェースを実現し、write方法を書き換える:public class LocalDateTimeSerializer implements ObjectSerializer { public static final LocalDateTimeSerializer instance = new LocalDateTimeSerializer(); private static final String defaultPattern = "yyyy-MM-dd HH:mm:ss"; public LocalDateTimeSerializer() { } @Override public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { SerializeWriter out = serializer.out; if (object == null) { out.writeNull(); } else { LocalDateTime result = (LocalDateTime) object; out.writeString(result.format(DateTimeFormatter.ofPattern(defaultPattern))); } } } SerializeConfig serializeConfig = SerializeConfig.globalInstance; serializeConfig.put(LocalDateTime.class, LocalDateTimeSerializer.instance); fastJsonConfig.setSerializeConfig(serializeConfig); // ,@JSONField , LocalDateTime ... Jacksonを使用する場合は、実用化Local DateTimeSerializerの時に、DateTimeFormaterを指定すればいいです.便利で多く、FastJsonが完敗して、私が習熟していないかもしれません.原文の住所:https://blog.csdn.net/luomin369433047/article/details/88972543