1
0
mirror of https://gitee.com/dromara/hutool.git synced 2025-04-05 17:37:59 +08:00

修复DayOfWeek转json异常问题

This commit is contained in:
Looly 2022-08-30 22:59:34 +08:00
parent 87a1cec9ed
commit 9fc7c40af9
5 changed files with 102 additions and 0 deletions
CHANGELOG.md
hutool-core/src/main/java/cn/hutool/core/convert
hutool-json/src
main/java/cn/hutool/json/serialize
test/java/cn/hutool/json

View File

@ -33,6 +33,7 @@
* 【core 】 修复FilterIter当参数filter为空时存在问题issue#I5OG7U@Gitee
* 【poi 】 修复Excel读取提示信息错误issue#I5OSFC@Gitee
* 【json 】 解决JSONObject#write无法递归的bugissue#I5OMSC@Gitee
* 【json 】 修复DayOfWeek转json异常问题issue#2572@Github
-------------------------------------------------------------------------------------------------------------

View File

@ -52,11 +52,14 @@ import java.net.URI;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.time.DayOfWeek;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
import java.time.MonthDay;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.Period;
@ -427,6 +430,9 @@ public class ConverterRegistry implements Serializable {
defaultConverterMap.put(ZonedDateTime.class, new TemporalAccessorConverter(ZonedDateTime.class));
defaultConverterMap.put(OffsetDateTime.class, new TemporalAccessorConverter(OffsetDateTime.class));
defaultConverterMap.put(OffsetTime.class, new TemporalAccessorConverter(OffsetTime.class));
defaultConverterMap.put(DayOfWeek.class, new TemporalAccessorConverter(DayOfWeek.class));
defaultConverterMap.put(Month.class, new TemporalAccessorConverter(Month.class));
defaultConverterMap.put(MonthDay.class, new TemporalAccessorConverter(MonthDay.class));
defaultConverterMap.put(Period.class, new PeriodConverter());
defaultConverterMap.put(Duration.class, new DurationConverter());

View File

@ -6,14 +6,19 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import java.time.DayOfWeek;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
import java.time.MonthDay;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.chrono.Era;
import java.time.chrono.IsoEra;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
@ -120,6 +125,16 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
return null;
}
if(DayOfWeek.class.equals(this.targetType)){
return DayOfWeek.valueOf(StrUtil.toString(value));
} else if(Month.class.equals(this.targetType)){
return Month.valueOf(StrUtil.toString(value));
} else if(Era.class.equals(this.targetType)){
return IsoEra.valueOf(StrUtil.toString(value));
} else if(MonthDay.class.equals(this.targetType)){
return MonthDay.parse(value);
}
final Instant instant;
ZoneId zoneId;
if (null != this.format) {
@ -141,6 +156,13 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
* @return java.time中的对象
*/
private TemporalAccessor parseFromLong(Long time) {
if(DayOfWeek.class.equals(this.targetType)){
return DayOfWeek.of(Math.toIntExact(time));
} else if(Month.class.equals(this.targetType)){
return Month.of(Math.toIntExact(time));
} else if(Era.class.equals(this.targetType)){
return IsoEra.of(Math.toIntExact(time));
}
return parseFromInstant(Instant.ofEpochMilli(time), null);
}
@ -151,6 +173,14 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
* @return java.time中的对象
*/
private TemporalAccessor parseFromTemporalAccessor(TemporalAccessor temporalAccessor) {
if(DayOfWeek.class.equals(this.targetType)){
return DayOfWeek.from(temporalAccessor);
} else if(Month.class.equals(this.targetType)){
return Month.from(temporalAccessor);
} else if(MonthDay.class.equals(this.targetType)){
return MonthDay.from(temporalAccessor);
}
TemporalAccessor result = null;
if (temporalAccessor instanceof LocalDateTime) {
result = parseFromLocalDateTime((LocalDateTime) temporalAccessor);

View File

@ -22,6 +22,9 @@ import cn.hutool.json.JSONUtil;
import java.io.IOException;
import java.io.Writer;
import java.time.DayOfWeek;
import java.time.MonthDay;
import java.time.chrono.Era;
import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
import java.util.Date;
@ -262,6 +265,14 @@ public class JSONWriter extends Writer {
} else if (value instanceof Number) {
writeNumberValue((Number) value);
} else if (value instanceof Date || value instanceof Calendar || value instanceof TemporalAccessor) {
// issue#2572@Github
if(value instanceof TemporalAccessor){
if(value instanceof DayOfWeek || value instanceof java.time.Month || value instanceof Era || value instanceof MonthDay){
writeStrValue(value.toString());
return this;
}
}
final String format = (null == config) ? null : config.getDateFormat();
writeRaw(formatDate(value, format));
} else if (value instanceof Boolean) {

View File

@ -0,0 +1,54 @@
package cn.hutool.json;
import cn.hutool.core.lang.TypeReference;
import org.junit.Assert;
import org.junit.Test;
import java.time.DayOfWeek;
import java.time.Month;
import java.time.MonthDay;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class Issue2572Test {
@Test
public void putDayOfWeekTest(){
final Set<DayOfWeek> weeks = new HashSet<>();
weeks.add(DayOfWeek.MONDAY);
final JSONObject obj = new JSONObject();
obj.set("weeks", weeks);
Assert.assertEquals("{\"weeks\":[\"MONDAY\"]}", obj.toString());
final Map<String, Set<DayOfWeek>> monthDays1 = obj.toBean(new TypeReference<Map<String, Set<DayOfWeek>>>() {
});
Assert.assertEquals("{weeks=[MONDAY]}", monthDays1.toString());
}
@Test
public void putMonthTest(){
final Set<Month> months = new HashSet<>();
months.add(Month.DECEMBER);
final JSONObject obj = new JSONObject();
obj.set("months", months);
Assert.assertEquals("{\"months\":[\"DECEMBER\"]}", obj.toString());
final Map<String, Set<Month>> monthDays1 = obj.toBean(new TypeReference<Map<String, Set<Month>>>() {
});
Assert.assertEquals("{months=[DECEMBER]}", monthDays1.toString());
}
@Test
public void putMonthDayTest(){
final Set<MonthDay> monthDays = new HashSet<>();
monthDays.add(MonthDay.of(Month.DECEMBER, 1));
final JSONObject obj = new JSONObject();
obj.set("monthDays", monthDays);
Assert.assertEquals("{\"monthDays\":[\"--12-01\"]}", obj.toString());
final Map<String, Set<MonthDay>> monthDays1 = obj.toBean(new TypeReference<Map<String, Set<MonthDay>>>() {
});
Assert.assertEquals("{monthDays=[--12-01]}", monthDays1.toString());
}
}