Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.StringCharacterIterator;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
Expand Down Expand Up @@ -185,6 +194,8 @@ protected void process(Object object, Method method) throws JSONException {
this.date((Date) object, method);
} else if (object instanceof Calendar) {
this.date(((Calendar) object).getTime(), method);
} else if (object instanceof TemporalAccessor) {
this.temporal((TemporalAccessor) object, method);
} else if (object instanceof Locale) {
this.string(object);
} else if (object instanceof Enum) {
Expand Down Expand Up @@ -506,6 +517,44 @@ protected void date(Date date, Method method) {
this.string(formatter.format(date));
}

/*
* Add temporal (java.time) value to buffer
*/
protected void temporal(TemporalAccessor temporal, Method method) {
JSON json = null;
if (method != null) {
json = method.getAnnotation(JSON.class);
}

DateTimeFormatter formatter;
if (json != null && json.format().length() > 0) {
formatter = DateTimeFormatter.ofPattern(json.format());
if (temporal instanceof Instant) {
formatter = formatter.withZone(ZoneOffset.UTC);
}
} else {
formatter = getDefaultDateTimeFormatter(temporal);
}
this.string(formatter.format(temporal));
}

private static DateTimeFormatter getDefaultDateTimeFormatter(TemporalAccessor temporal) {
if (temporal instanceof LocalDate) {
return DateTimeFormatter.ISO_LOCAL_DATE;
} else if (temporal instanceof LocalDateTime) {
return DateTimeFormatter.ISO_LOCAL_DATE_TIME;
} else if (temporal instanceof LocalTime) {
return DateTimeFormatter.ISO_LOCAL_TIME;
} else if (temporal instanceof ZonedDateTime) {
return DateTimeFormatter.ISO_ZONED_DATE_TIME;
} else if (temporal instanceof OffsetDateTime) {
return DateTimeFormatter.ISO_OFFSET_DATE_TIME;
} else if (temporal instanceof Instant) {
return DateTimeFormatter.ISO_INSTANT;
}
return DateTimeFormatter.ISO_DATE_TIME;
}

/*
* Add array to buffer
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,15 @@
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalQuery;
import java.util.*;

/**
Expand Down Expand Up @@ -132,7 +141,11 @@ private static boolean isJSONPrimitive(Class clazz) {
|| clazz.equals(Boolean.class) || clazz.equals(Byte.class) || clazz.equals(Character.class)
|| clazz.equals(Double.class) || clazz.equals(Float.class) || clazz.equals(Integer.class)
|| clazz.equals(Long.class) || clazz.equals(Short.class) || clazz.equals(Locale.class)
|| clazz.isEnum();
|| clazz.isEnum()
|| Calendar.class.isAssignableFrom(clazz)
|| clazz.equals(LocalDate.class) || clazz.equals(LocalDateTime.class)
|| clazz.equals(LocalTime.class) || clazz.equals(ZonedDateTime.class)
|| clazz.equals(OffsetDateTime.class) || clazz.equals(Instant.class);
}

@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -367,6 +380,32 @@ else if (String.class.equals(clazz))
LOG.error("Unable to parse date from: {}", value, e);
throw new JSONException("Unable to parse date from: " + value);
}
} else if (Calendar.class.isAssignableFrom(clazz)) {
try {
JSON json = method.getAnnotation(JSON.class);

DateFormat formatter = new SimpleDateFormat(
(json != null) && (json.format().length() > 0) ? json.format() : this.dateFormat);
Date date = formatter.parse((String) value);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal;
} catch (ParseException e) {
LOG.error("Unable to parse calendar from: {}", value, e);
throw new JSONException("Unable to parse calendar from: " + value);
}
} else if (clazz.equals(LocalDate.class)) {
return parseTemporalFromString(value, method, DateTimeFormatter.ISO_LOCAL_DATE, LocalDate::from);
} else if (clazz.equals(LocalDateTime.class)) {
return parseTemporalFromString(value, method, DateTimeFormatter.ISO_LOCAL_DATE_TIME, LocalDateTime::from);
} else if (clazz.equals(LocalTime.class)) {
return parseTemporalFromString(value, method, DateTimeFormatter.ISO_LOCAL_TIME, LocalTime::from);
} else if (clazz.equals(ZonedDateTime.class)) {
return parseTemporalFromString(value, method, DateTimeFormatter.ISO_ZONED_DATE_TIME, ZonedDateTime::from);
} else if (clazz.equals(OffsetDateTime.class)) {
return parseTemporalFromString(value, method, DateTimeFormatter.ISO_OFFSET_DATE_TIME, OffsetDateTime::from);
} else if (clazz.equals(Instant.class)) {
return parseInstantFromString(value, method);
} else if (clazz.isEnum()) {
String sValue = (String) value;
return Enum.valueOf(clazz, sValue);
Expand Down Expand Up @@ -424,4 +463,38 @@ else if (Character.TYPE.equals(clazz) || Character.class.equals(clazz)) {
return value;
}

private <T> T parseTemporalFromString(Object value, Method method, DateTimeFormatter defaultFormatter, TemporalQuery<T> query) throws JSONException {
try {
String sValue = (String) value;
JSON json = method.getAnnotation(JSON.class);

DateTimeFormatter formatter;
if (json != null && json.format().length() > 0) {
formatter = DateTimeFormatter.ofPattern(json.format());
} else {
formatter = defaultFormatter;
}
return formatter.parse(sValue, query);
} catch (Exception e) {
LOG.error("Unable to parse temporal from: {}", value, e);
throw new JSONException("Unable to parse temporal from: " + value);
}
}

private Instant parseInstantFromString(Object value, Method method) throws JSONException {
try {
String sValue = (String) value;
JSON json = method.getAnnotation(JSON.class);

if (json != null && json.format().length() > 0) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(json.format()).withZone(ZoneOffset.UTC);
return Instant.from(formatter.parse(sValue));
}
return Instant.parse(sValue);
} catch (Exception e) {
LOG.error("Unable to parse instant from: {}", value, e);
throw new JSONException("Unable to parse instant from: " + value);
}
}

}
Loading
Loading