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に注釈が付いています.例えば:
注釈の使用を減らすために、FastJsonにデフォルトでロカDateTime類を導入してもいいですか?まず恒例のFastJsonfigを祭ります.
しかし、ちょっと卵が痛いところは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