From af1f14b439d6221f4388616f9da278d428414b91 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 6 Sep 2024 01:45:22 +0800 Subject: [PATCH] fix code --- .../{ => fastjson}/FastJSON2Engine.java | 4 +- .../json/engine/fastjson/package-info.java | 24 +++++++ .../hutool/json/engine/gson/DateSerDesc.java | 64 +++++++++++++++++++ .../hutool/json/engine/gson/GsonEngine.java | 36 ++++++----- .../hutool/json/engine/gson/GsonSerDesc.java | 30 +++++++++ .../json/engine/gson/TemporalSerDesc.java | 63 ++++++++++++++++++ .../engine/{ => jackson}/JacksonEngine.java | 6 +- .../jackson/JacksonTemporalDeserializer.java | 42 ++++++++++++ .../jackson/JacksonTemporalSerializer.java | 58 +++++++++++++++++ .../json/engine/jackson/TemporalModule.java | 39 +++++++++++ .../org.dromara.hutool.json.engine.JSONEngine | 4 +- .../hutool/json/engine/BeanWithDate.java | 2 + .../hutool/json/engine/BeanWithLocalDate.java | 28 ++++++++ .../hutool/json/engine/FastJSONTest.java | 29 --------- .../dromara/hutool/json/engine/GsonTest.java | 20 ++---- .../hutool/json/engine/HutoolJSONTest.java | 29 --------- .../json/engine/JSONEngineFactoryTest.java | 2 + .../hutool/json/engine/JSONEngineTest.java | 61 ++++++++++++++++++ .../hutool/json/engine/JacksonTest.java | 30 --------- 19 files changed, 448 insertions(+), 123 deletions(-) rename hutool-json/src/main/java/org/dromara/hutool/json/engine/{ => fastjson}/FastJSON2Engine.java (95%) create mode 100644 hutool-json/src/main/java/org/dromara/hutool/json/engine/fastjson/package-info.java create mode 100644 hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/DateSerDesc.java create mode 100644 hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/GsonSerDesc.java create mode 100644 hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/TemporalSerDesc.java rename hutool-json/src/main/java/org/dromara/hutool/json/engine/{ => jackson}/JacksonEngine.java (93%) create mode 100644 hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/JacksonTemporalDeserializer.java create mode 100644 hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/JacksonTemporalSerializer.java create mode 100644 hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/TemporalModule.java create mode 100644 hutool-json/src/test/java/org/dromara/hutool/json/engine/BeanWithLocalDate.java diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/FastJSON2Engine.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/fastjson/FastJSON2Engine.java similarity index 95% rename from hutool-json/src/main/java/org/dromara/hutool/json/engine/FastJSON2Engine.java rename to hutool-json/src/main/java/org/dromara/hutool/json/engine/fastjson/FastJSON2Engine.java index fa5936d06..1e2b80cce 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/engine/FastJSON2Engine.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/fastjson/FastJSON2Engine.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.dromara.hutool.json.engine; +package org.dromara.hutool.json.engine.fastjson; import com.alibaba.fastjson2.JSONFactory; import com.alibaba.fastjson2.JSONReader; @@ -24,6 +24,8 @@ import com.alibaba.fastjson2.writer.ObjectWriter; import org.dromara.hutool.core.collection.ListUtil; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.util.ObjUtil; +import org.dromara.hutool.json.engine.AbstractJSONEngine; +import org.dromara.hutool.json.engine.JSONEngineConfig; import java.io.Reader; import java.io.Writer; diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/fastjson/package-info.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/fastjson/package-info.java new file mode 100644 index 000000000..4b3394320 --- /dev/null +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/fastjson/package-info.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2024 Hutool Team and hutool.cn + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Fastjson2引擎实现
+ * https://github.com/alibaba/fastjson2 + * + * @author Looly + * @since 6.0.0 + */ +package org.dromara.hutool.json.engine.fastjson; diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/DateSerDesc.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/DateSerDesc.java new file mode 100644 index 000000000..b8200972a --- /dev/null +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/DateSerDesc.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2024 Hutool Team and hutool.cn + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.hutool.json.engine.gson; + +import com.google.gson.*; +import org.dromara.hutool.core.date.DateUtil; +import org.dromara.hutool.core.text.StrUtil; + +import java.lang.reflect.Type; +import java.util.Date; + +/** + * 日期序列化描述
+ * 参考:https://stackoverflow.com/questions/41979086/how-to-serialize-date-to-long-using-gson + * + * @author Looly + * @since 6.0.0 + */ +public class DateSerDesc implements GsonSerDesc { + + /** + * 默认日期格式化描述,默认为null,表示使用时间戳 + */ + public static final DateSerDesc INSTANCE = new DateSerDesc(null); + + private final String dateFormat; + + /** + * 构造 + * + * @param dateFormat 日期格式 + */ + public DateSerDesc(final String dateFormat) { + this.dateFormat = dateFormat; + } + + @Override + public JsonElement serialize(final Date src, final Type typeOfSrc, final JsonSerializationContext context) { + return StrUtil.isEmpty(dateFormat) ? + new JsonPrimitive(src.getTime()) : + new JsonPrimitive(DateUtil.format(src, dateFormat)); + } + + @Override + public Date deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException { + return StrUtil.isEmpty(dateFormat) ? + DateUtil.date(json.getAsLong()) : + DateUtil.parse(json.getAsString(), dateFormat); + } +} diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/GsonEngine.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/GsonEngine.java index 8814253ee..ffad6697f 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/GsonEngine.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/GsonEngine.java @@ -16,10 +16,9 @@ package org.dromara.hutool.json.engine.gson; -import com.google.gson.*; -import org.dromara.hutool.core.date.TimeUtil; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import org.dromara.hutool.core.lang.Assert; -import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.ObjUtil; import org.dromara.hutool.json.JSONException; import org.dromara.hutool.json.engine.AbstractJSONEngine; @@ -28,7 +27,9 @@ import org.dromara.hutool.json.engine.JSONEngineConfig; import java.io.Reader; import java.io.Writer; import java.lang.reflect.Type; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.Date; /** @@ -86,23 +87,28 @@ public class GsonEngine extends AbstractJSONEngine { if (config.isPrettyPrint()) { builder.setPrettyPrinting(); } + final String dateFormat = config.getDateFormat(); - if (StrUtil.isNotEmpty(dateFormat)) { - builder.setDateFormat(dateFormat); - builder.registerTypeAdapter(LocalDateTime.class, (JsonDeserializer) (json, typeOfT, context) -> TimeUtil.parse(json.getAsString(), dateFormat)); - builder.registerTypeAdapter(LocalDateTime.class, (JsonSerializer) (date, type, jsonSerializationContext) -> new JsonPrimitive(TimeUtil.format(date, dateFormat))); - } else { - // 无自定义格式,则默认输出时间戳 - // https://stackoverflow.com/questions/41979086/how-to-serialize-date-to-long-using-gson - builder.registerTypeAdapter(Date.class, (JsonDeserializer) (json, typeOfT, context) -> new Date(json.getAsJsonPrimitive().getAsLong())); - builder.registerTypeAdapter(Date.class, (JsonSerializer) (date, type, jsonSerializationContext) -> new JsonPrimitive(date.getTime())); - builder.registerTypeAdapter(LocalDateTime.class, (JsonDeserializer) (json, typeOfT, context) -> TimeUtil.of(json.getAsJsonPrimitive().getAsLong())); - builder.registerTypeAdapter(LocalDateTime.class, (JsonSerializer) (date, type, jsonSerializationContext) -> new JsonPrimitive(TimeUtil.toEpochMilli(date))); - } + registerDate(builder, dateFormat); + if(!config.isIgnoreNullValue()){ builder.serializeNulls(); } this.gson = builder.create(); } + + /** + * 注册日期相关序列化描述
+ * 参考:https://stackoverflow.com/questions/41979086/how-to-serialize-date-to-long-using-gson + * + * @param builder Gson构造器 + * @param dateFormat 日期格式 + */ + private void registerDate(final GsonBuilder builder, final String dateFormat){ + builder.registerTypeAdapter(Date.class, new DateSerDesc(dateFormat)); + builder.registerTypeAdapter(LocalDateTime.class, new TemporalSerDesc(LocalDateTime.class, dateFormat)); + builder.registerTypeAdapter(LocalDate.class, new TemporalSerDesc(LocalDate.class, dateFormat)); + builder.registerTypeAdapter(LocalTime.class, new TemporalSerDesc(LocalTime.class, dateFormat)); + } } diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/GsonSerDesc.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/GsonSerDesc.java new file mode 100644 index 000000000..c54bd9d42 --- /dev/null +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/GsonSerDesc.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2024 Hutool Team and hutool.cn + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.hutool.json.engine.gson; + +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonSerializer; + +/** + * Gson序列化描述接口,用于自定义序列化和反序列化 + * + * @param 序列化对象类型 + * @author Looly + * @since 6.0.0 + */ +public interface GsonSerDesc extends JsonSerializer, JsonDeserializer { +} diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/TemporalSerDesc.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/TemporalSerDesc.java new file mode 100644 index 000000000..fca4269f4 --- /dev/null +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/gson/TemporalSerDesc.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2024 Hutool Team and hutool.cn + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.hutool.json.engine.gson; + +import com.google.gson.*; +import org.dromara.hutool.core.convert.ConvertUtil; +import org.dromara.hutool.core.date.TimeUtil; +import org.dromara.hutool.core.text.StrUtil; + +import java.lang.reflect.Type; +import java.time.temporal.TemporalAccessor; + +/** + * 时间相关对象序列化描述 + * + * @author Looly + * @since 6.0.0 + */ +public class TemporalSerDesc implements GsonSerDesc { + + private final Class type; + private final String dateFormat; + + /** + * 构造 + * + * @param type 时间类型 + * @param dateFormat 日期格式 + */ + public TemporalSerDesc(final Class type, final String dateFormat) { + this.type = type; + this.dateFormat = dateFormat; + } + + + @Override + public JsonElement serialize(final TemporalAccessor src, final Type typeOfSrc, final JsonSerializationContext context) { + return StrUtil.isEmpty(dateFormat) ? + new JsonPrimitive(TimeUtil.toEpochMilli(src)) : + new JsonPrimitive(TimeUtil.format(src, dateFormat)); + } + + @Override + public TemporalAccessor deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException { + return StrUtil.isEmpty(dateFormat) ? + ConvertUtil.convert(this.type, json.getAsLong()) : + ConvertUtil.convert(this.type, TimeUtil.parse(json.getAsString(), dateFormat)); + } +} diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/JacksonEngine.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/JacksonEngine.java similarity index 93% rename from hutool-json/src/main/java/org/dromara/hutool/json/engine/JacksonEngine.java rename to hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/JacksonEngine.java index 7ad2a248c..b74768921 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/engine/JacksonEngine.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/JacksonEngine.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.dromara.hutool.json.engine; +package org.dromara.hutool.json.engine.jackson; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonParser; @@ -30,6 +30,8 @@ import org.dromara.hutool.core.reflect.ConstructorUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.ObjUtil; import org.dromara.hutool.json.JSONException; +import org.dromara.hutool.json.engine.AbstractJSONEngine; +import org.dromara.hutool.json.engine.JSONEngineConfig; import java.io.IOException; import java.io.Reader; @@ -122,6 +124,8 @@ public class JacksonEngine extends AbstractJSONEngine { mapper.enable(SerializationFeature.INDENT_OUTPUT); } final String dateFormat = config.getDateFormat(); + // 用于处理java.time库中对象的序列化和反序列化 + mapper.registerModule(new TemporalModule(dateFormat)); if(StrUtil.isNotEmpty(dateFormat)){ mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); mapper.setDateFormat(DateUtil.newSimpleFormat(dateFormat)); diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/JacksonTemporalDeserializer.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/JacksonTemporalDeserializer.java new file mode 100644 index 000000000..6a3176bd9 --- /dev/null +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/JacksonTemporalDeserializer.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2024 Hutool Team and hutool.cn + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.hutool.json.engine.jackson; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +import java.io.IOException; +import java.time.temporal.TemporalAccessor; + +public class JacksonTemporalDeserializer extends StdDeserializer { + + private final Class type; + private final String dateFormat; + + public JacksonTemporalDeserializer(final Class type, final String dateFormat) { + super(TemporalAccessor.class); + this.type = type; + this.dateFormat = dateFormat; + } + + @Override + public TemporalAccessor deserialize(final JsonParser p, final DeserializationContext ctxt) throws IOException, JacksonException { + return null; + } +} diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/JacksonTemporalSerializer.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/JacksonTemporalSerializer.java new file mode 100644 index 000000000..f2d1a05ba --- /dev/null +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/JacksonTemporalSerializer.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2024 Hutool Team and hutool.cn + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.hutool.json.engine.jackson; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import org.dromara.hutool.core.date.TimeUtil; +import org.dromara.hutool.core.text.StrUtil; + +import java.io.IOException; +import java.time.temporal.TemporalAccessor; + +/** + * Jackson处理{@link TemporalAccessor}相关对象序列化描述 + * + * @author Looly + * @since 6.0.0 + */ +public class JacksonTemporalSerializer extends StdSerializer { + private static final long serialVersionUID = 1L; + + private final String format; + + /** + * 构造 + * + * @param format 日期格式,null表示使用时间戳 + */ + public JacksonTemporalSerializer(final String format) { + super(TemporalAccessor.class); + this.format = format; + } + + @Override + public void serialize(final TemporalAccessor value, final JsonGenerator gen, final SerializerProvider serializers) throws IOException { + if (StrUtil.isEmpty(this.format)) { + final long epochMilli = TimeUtil.toEpochMilli(value); + gen.writeNumber(epochMilli); + } else { + gen.writeString(TimeUtil.format(value, this.format)); + } + } +} diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/TemporalModule.java b/hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/TemporalModule.java new file mode 100644 index 000000000..d5c7910da --- /dev/null +++ b/hutool-json/src/main/java/org/dromara/hutool/json/engine/jackson/TemporalModule.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2024 Hutool Team and hutool.cn + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.hutool.json.engine.jackson; + +import com.fasterxml.jackson.databind.module.SimpleModule; + +/** + * 时间相关序列化模块 + * + * @author Looly + * @since 6.0.0 + */ +public class TemporalModule extends SimpleModule { + private static final long serialVersionUID = 1L; + + /** + * 构造 + * + * @param dateFormat 日期格式,null表示使用时间戳 + */ + public TemporalModule(final String dateFormat) { + super(); + this.addSerializer(new JacksonTemporalSerializer(dateFormat)); + } +} diff --git a/hutool-json/src/main/resources/META-INF/services/org.dromara.hutool.json.engine.JSONEngine b/hutool-json/src/main/resources/META-INF/services/org.dromara.hutool.json.engine.JSONEngine index 993f6a109..c65704da6 100644 --- a/hutool-json/src/main/resources/META-INF/services/org.dromara.hutool.json.engine.JSONEngine +++ b/hutool-json/src/main/resources/META-INF/services/org.dromara.hutool.json.engine.JSONEngine @@ -14,7 +14,7 @@ # limitations under the License. # -org.dromara.hutool.json.engine.JacksonEngine +org.dromara.hutool.json.engine.jackson.JacksonEngine org.dromara.hutool.json.engine.gson.GsonEngine -org.dromara.hutool.json.engine.FastJSON2Engine +org.dromara.hutool.json.engine.fastjson.FastJSON2Engine org.dromara.hutool.json.engine.HutoolJSONEngine diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/engine/BeanWithDate.java b/hutool-json/src/test/java/org/dromara/hutool/json/engine/BeanWithDate.java index a1987bc08..ca70c3f56 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/engine/BeanWithDate.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/engine/BeanWithDate.java @@ -18,11 +18,13 @@ package org.dromara.hutool.json.engine; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import java.time.LocalDateTime; import java.util.Date; @Data +@NoArgsConstructor @AllArgsConstructor public class BeanWithDate { private Date date1; diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/engine/BeanWithLocalDate.java b/hutool-json/src/test/java/org/dromara/hutool/json/engine/BeanWithLocalDate.java new file mode 100644 index 000000000..367292d4f --- /dev/null +++ b/hutool-json/src/test/java/org/dromara/hutool/json/engine/BeanWithLocalDate.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024 Hutool Team and hutool.cn + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.hutool.json.engine; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.time.LocalDate; + +@Data +@AllArgsConstructor +public class BeanWithLocalDate { + private LocalDate date; +} diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/engine/FastJSONTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/engine/FastJSONTest.java index a1b462bce..a7001227e 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/engine/FastJSONTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/engine/FastJSONTest.java @@ -16,9 +16,6 @@ package org.dromara.hutool.json.engine; -import org.dromara.hutool.core.date.DateTime; -import org.dromara.hutool.core.date.DateUtil; -import org.dromara.hutool.core.date.TimeUtil; import org.dromara.hutool.core.text.StrUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -39,30 +36,4 @@ public class FastJSONTest { " \"gender\":true\n" + "}", jsonString); } - - @Test - void writeDateFormatTest() { - final DateTime date = DateUtil.parse("2024-01-01 01:12:21"); - final BeanWithDate bean = new BeanWithDate(date, TimeUtil.of(date)); - final JSONEngine engine = JSONEngineFactory.createEngine("fastjson"); - - final String jsonString = engine.toJsonString(bean); - Assertions.assertEquals("{\"date1\":1704042741000,\"date2\":1704042741000}", jsonString); - - engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); - Assertions.assertEquals("{\"date1\":\"2024-01-01 01:12:21\",\"date2\":\"2024-01-01 01:12:21\"}", engine.toJsonString(bean)); - } - - @Test - void writeNullTest() { - final BeanWithDate bean = new BeanWithDate(null, null); - final JSONEngine engine = JSONEngineFactory.createEngine("fastjson"); - - String jsonString = engine.toJsonString(bean); - Assertions.assertEquals("{}", jsonString); - - engine.init(JSONEngineConfig.of().setIgnoreNullValue(false)); - jsonString = engine.toJsonString(bean); - Assertions.assertEquals("{\"date1\":null,\"date2\":null}", jsonString); - } } diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/engine/GsonTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/engine/GsonTest.java index 9e01912af..0a1037ccc 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/engine/GsonTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/engine/GsonTest.java @@ -42,28 +42,16 @@ public class GsonTest { } @Test - void writeDateFormatTest() { + void writeLocalDateFormatTest() { final DateTime date = DateUtil.parse("2024-01-01 01:12:21"); - final BeanWithDate bean = new BeanWithDate(date, TimeUtil.of(date)); + final BeanWithLocalDate bean = new BeanWithLocalDate(TimeUtil.of(date).toLocalDate()); final JSONEngine engine = JSONEngineFactory.createEngine("gson"); final String jsonString = engine.toJsonString(bean); - Assertions.assertEquals("{\"date1\":1704042741000,\"date2\":1704042741000}", jsonString); + Assertions.assertEquals("{\"date\":1704038400000}", jsonString); engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); - Assertions.assertEquals("{\"date1\":\"2024-01-01 01:12:21\",\"date2\":\"2024-01-01 01:12:21\"}", engine.toJsonString(bean)); + Assertions.assertEquals("{\"date\":\"2024-01-01 00:00:00\"}", engine.toJsonString(bean)); } - @Test - void writeNullTest() { - final BeanWithDate bean = new BeanWithDate(null, null); - final JSONEngine engine = JSONEngineFactory.createEngine("gson"); - - String jsonString = engine.toJsonString(bean); - Assertions.assertEquals("{}", jsonString); - - engine.init(JSONEngineConfig.of().setIgnoreNullValue(false)); - jsonString = engine.toJsonString(bean); - Assertions.assertEquals("{\"date1\":null,\"date2\":null}", jsonString); - } } diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/engine/HutoolJSONTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/engine/HutoolJSONTest.java index 408cdc84f..d85710ae7 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/engine/HutoolJSONTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/engine/HutoolJSONTest.java @@ -16,9 +16,6 @@ package org.dromara.hutool.json.engine; -import org.dromara.hutool.core.date.DateTime; -import org.dromara.hutool.core.date.DateUtil; -import org.dromara.hutool.core.date.TimeUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -36,30 +33,4 @@ public class HutoolJSONTest { " \"gender\": true\n" + "}", jsonString); } - - @Test - void writeDateFormatTest() { - final DateTime date = DateUtil.parse("2024-01-01 01:12:21"); - final BeanWithDate bean = new BeanWithDate(date, TimeUtil.of(date)); - final JSONEngine engine = JSONEngineFactory.createEngine("hutool"); - - final String jsonString = engine.toJsonString(bean); - Assertions.assertEquals("{\"date1\":1704042741000,\"date2\":1704042741000}", jsonString); - - engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); - Assertions.assertEquals("{\"date1\":\"2024-01-01 01:12:21\",\"date2\":\"2024-01-01 01:12:21\"}", engine.toJsonString(bean)); - } - - @Test - void writeNullTest() { - final BeanWithDate bean = new BeanWithDate(null, null); - final JSONEngine engine = JSONEngineFactory.createEngine("hutool"); - - String jsonString = engine.toJsonString(bean); - Assertions.assertEquals("{}", jsonString); - - engine.init(JSONEngineConfig.of().setIgnoreNullValue(false)); - jsonString = engine.toJsonString(bean); - Assertions.assertEquals("{\"date1\":null,\"date2\":null}", jsonString); - } } diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/engine/JSONEngineFactoryTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/engine/JSONEngineFactoryTest.java index 20f36934b..fe033025e 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/engine/JSONEngineFactoryTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/engine/JSONEngineFactoryTest.java @@ -20,7 +20,9 @@ import com.alibaba.fastjson2.annotation.JSONField; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import org.dromara.hutool.json.engine.fastjson.FastJSON2Engine; import org.dromara.hutool.json.engine.gson.GsonEngine; +import org.dromara.hutool.json.engine.jackson.JacksonEngine; import org.junit.jupiter.api.Test; import java.io.StringReader; diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/engine/JSONEngineTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/engine/JSONEngineTest.java index ee4b63ce8..4d7c573c2 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/engine/JSONEngineTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/engine/JSONEngineTest.java @@ -16,5 +16,66 @@ package org.dromara.hutool.json.engine; +import org.dromara.hutool.core.date.DateTime; +import org.dromara.hutool.core.date.DateUtil; +import org.dromara.hutool.core.date.TimeUtil; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + public class JSONEngineTest { + + private final String[] engineNames = {"jackson", "gson", "fastjson", "hutool"}; + + @Test + void writeDateFormatTest() { + Arrays.stream(engineNames).forEach(this::assertWriteDateFormat); + } + + @Test + void writeNullTest() { + Arrays.stream(engineNames).forEach(this::assertWriteNull); + } + + @Test + void writeLocalDateFormatTest() { + Arrays.stream(engineNames).forEach(this::assertWriteLocalDateFormat); + } + + private void assertWriteDateFormat(final String engineName) { + final DateTime date = DateUtil.parse("2024-01-01 01:12:21"); + final BeanWithDate bean = new BeanWithDate(date, TimeUtil.of(date)); + final JSONEngine engine = JSONEngineFactory.createEngine(engineName); + + final String jsonString = engine.toJsonString(bean); + Assertions.assertEquals("{\"date1\":1704042741000,\"date2\":1704042741000}", jsonString); + + engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); + Assertions.assertEquals("{\"date1\":\"2024-01-01 01:12:21\",\"date2\":\"2024-01-01 01:12:21\"}", engine.toJsonString(bean)); + } + + void assertWriteLocalDateFormat(final String engineName) { + final DateTime date = DateUtil.parse("2024-01-01 01:12:21"); + final BeanWithLocalDate bean = new BeanWithLocalDate(TimeUtil.of(date).toLocalDate()); + final JSONEngine engine = JSONEngineFactory.createEngine(engineName); + + final String jsonString = engine.toJsonString(bean); + Assertions.assertEquals("{\"date\":1704038400000}", jsonString); + + engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); + Assertions.assertEquals("{\"date\":\"2024-01-01 00:00:00\"}", engine.toJsonString(bean)); + } + + private void assertWriteNull(final String engineName) { + final BeanWithDate bean = new BeanWithDate(null, null); + final JSONEngine engine = JSONEngineFactory.createEngine(engineName); + + String jsonString = engine.toJsonString(bean); + Assertions.assertEquals("{}", jsonString); + + engine.init(JSONEngineConfig.of().setIgnoreNullValue(false)); + jsonString = engine.toJsonString(bean); + Assertions.assertEquals("{\"date1\":null,\"date2\":null}", jsonString); + } } diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/engine/JacksonTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/engine/JacksonTest.java index 4ac653191..fb764a814 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/engine/JacksonTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/engine/JacksonTest.java @@ -16,9 +16,6 @@ package org.dromara.hutool.json.engine; -import org.dromara.hutool.core.date.DateTime; -import org.dromara.hutool.core.date.DateUtil; -import org.dromara.hutool.core.date.TimeUtil; import org.dromara.hutool.core.text.StrUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -42,31 +39,4 @@ public class JacksonTest { " \"gender\" : true\n" + "}", jsonString); } - - @Test - void writeDateFormatTest() { - final DateTime date = DateUtil.parse("2024-01-01 01:12:21"); - final BeanWithDate bean = new BeanWithDate(date, TimeUtil.of(date)); - final JSONEngine engine = JSONEngineFactory.createEngine("jackson"); - - final String jsonString = engine.toJsonString(bean); - Assertions.assertEquals("{\"date1\":1704042741000,\"date2\":[2024,1,1,1,12,21]}", jsonString); - - //TODO LocalDateTime的格式化未解决 - engine.init(JSONEngineConfig.of().setDateFormat("yyyy-MM-dd HH:mm:ss")); - Assertions.assertEquals("{\"date1\":\"2024-01-01 01:12:21\",\"date2\":\"2024-01-01T01:12:21\"}", engine.toJsonString(bean)); - } - - @Test - void writeNullTest() { - final BeanWithDate bean = new BeanWithDate(null, null); - final JSONEngine engine = JSONEngineFactory.createEngine("jackson"); - - String jsonString = engine.toJsonString(bean); - Assertions.assertEquals("{}", jsonString); - - engine.init(JSONEngineConfig.of().setIgnoreNullValue(false)); - jsonString = engine.toJsonString(bean); - Assertions.assertEquals("{\"date1\":null,\"date2\":null}", jsonString); - } }