Skip to content

Commit

Permalink
v0.0.6
Browse files Browse the repository at this point in the history
1、支持LocalDate,LocalDateTime,LocalTime, ZonedDateTime,Instant的JSON序列化和反序列化字符串处理;
2、日期类支持夏令时及性能优化;
3、HttpClient读取流优化;
  • Loading branch information
wangyunchao committed Aug 21, 2022
1 parent eef6067 commit edda136
Show file tree
Hide file tree
Showing 18 changed files with 2,195 additions and 0 deletions.
427 changes: 427 additions & 0 deletions src/main/java/io/github/wycst/wast/common/beans/GeneralDate.java

Large diffs are not rendered by default.

109 changes: 109 additions & 0 deletions src/main/java/io/github/wycst/wast/json/JSONTemporalDeserializer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package io.github.wycst.wast.json;

import io.github.wycst.wast.common.beans.DateTemplate;
import io.github.wycst.wast.common.reflect.ClassStructureWrapper;
import io.github.wycst.wast.common.reflect.GenericParameterizedType;
import io.github.wycst.wast.json.exceptions.JSONException;
import io.github.wycst.wast.json.options.JSONParseContext;
import io.github.wycst.wast.json.temporal.*;

import java.lang.reflect.InvocationTargetException;

/**
* java.time support
* <p>
* Deserialization using reflection
* <p>
* Localtime, localdate, localdatetime do not consider time zone
*
* @Author: wangy
* @Date: 2022/8/13 15:08
* @Description:
*/
public abstract class JSONTemporalDeserializer extends JSONTypeDeserializer {

protected int patternType;
protected DateTemplate dateTemplate;

protected JSONTemporalDeserializer(GenericParameterizedType parameterizedType) {
checkClass(parameterizedType);
String pattern = parameterizedType.getDatePattern();
patternType = getPatternType(pattern);
if (patternType == 0) {
createDefaultTemplate();
} else {
dateTemplate = new DateTemplate(pattern);
}
}

static JSONTypeDeserializer getTemporalDeserializerInstance(ClassStructureWrapper.ClassWrapperType classWrapperType, GenericParameterizedType genericParameterizedType) {
switch (classWrapperType) {
case TemporalLocalDate: {
return new TemporalLocalDateDeserializer(genericParameterizedType);
}
case TemporalLocalTime: {
return new TemporalLocalTimeDeserializer(genericParameterizedType);
}
case TemporalLocalDateTime: {
return new TemporalLocalDateTimeDeserializer(genericParameterizedType);
}
case TemporalZonedDateTime: {
return new TemporalZonedDateTimeDeserializer(genericParameterizedType);
}
case TemporalInstant: {
return new TemporalInstantDeserializer(genericParameterizedType);
}
default: {
throw new UnsupportedOperationException();
}
}
}

protected void createDefaultTemplate() {
}

// check
protected abstract void checkClass(GenericParameterizedType genericParameterizedType);

/**
* Temporal 暂时只支持字符串(")和null
*
* @param buf
* @param fromIndex
* @param toIndex
* @param parameterizedType
* @param defaultValue
* @param endToken
* @param jsonParseContext
* @return
* @throws Exception
*/
@Override
protected Object deserialize(char[] buf, int fromIndex, int toIndex, GenericParameterizedType parameterizedType, Object defaultValue, char endToken, JSONParseContext jsonParseContext) throws Exception {
char beginChar = buf[fromIndex];
switch (beginChar) {
case '"':
STRING.skip(buf, fromIndex, toIndex, jsonParseContext);
int endIndex = jsonParseContext.getEndIndex();
try {
return deserializeTemporal(buf, fromIndex, endIndex, jsonParseContext);
} catch (Throwable throwable) {
if (throwable instanceof InvocationTargetException) {
throwable = ((InvocationTargetException) throwable).getTargetException();
}
String source = new String(buf, fromIndex + 1, endIndex - fromIndex - 1);
String errorContextTextAt = createErrorContextText(buf, fromIndex);
throw new JSONException("Syntax error, at pos " + fromIndex + ", context text by '" + errorContextTextAt + "', temporal text '" + source + "' cannot convert to the temporal type , exception: " + throwable.getMessage());
}
case 'n':
return NULL.deserialize(buf, fromIndex, toIndex, null, null, jsonParseContext);
default: {
// not support or custom handle ?
String errorContextTextAt = createErrorContextText(buf, fromIndex);
throw new JSONException("Syntax error, at pos " + fromIndex + ", context text by '" + errorContextTextAt + "', unexpected token character '" + beginChar + "' for Temporal Type, expected '\"' ");
}
}
}

protected abstract Object deserializeTemporal(char[] buf, int fromIndex, int toIndex, JSONParseContext jsonParseContext) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package io.github.wycst.wast.json;

import io.github.wycst.wast.common.beans.DateTemplate;
import io.github.wycst.wast.common.reflect.ClassStructureWrapper;
import io.github.wycst.wast.json.annotations.JsonProperty;
import io.github.wycst.wast.json.options.JsonConfig;
import io.github.wycst.wast.json.reflect.ObjectStructureWrapper;
import io.github.wycst.wast.json.temporal.*;

import java.io.Writer;

/**
* java.time support
* <p>
* Serialization using reflection
* <p>
* Localtime, localdate, localdatetime do not consider time zone
*
* @Author: wangy
* @Date: 2022/8/13 15:08
* @Description:
*/
public abstract class JSONTemporalSerializer extends JSONTypeSerializer {

protected final ObjectStructureWrapper objectStructureWrapper;
protected int patternType;
protected DateTemplate dateTemplate;
protected final boolean useTemplate;

protected JSONTemporalSerializer(ObjectStructureWrapper objectStructureWrapper, JsonProperty property) {
checkClass(objectStructureWrapper);
this.objectStructureWrapper = objectStructureWrapper;
if (property != null) {
String pattern = property.pattern().trim();
patternType = getPatternType(pattern);
if (patternType == 0) {
createDefaultTemplate();
} else {
dateTemplate = new DateTemplate(pattern);
}
}
useTemplate = dateTemplate != null;
}

static JSONTypeSerializer getTemporalSerializerInstance(ObjectStructureWrapper objectStructureWrapper, JsonProperty property) {
ClassStructureWrapper.ClassWrapperType classWrapperType = objectStructureWrapper.getClassWrapperType();
switch (classWrapperType) {
case TemporalLocalDate: {
return new TemporalLocalDateSerializer(objectStructureWrapper, property);
}
case TemporalLocalTime: {
return new TemporalLocalTimeSerializer(objectStructureWrapper, property);
}
case TemporalLocalDateTime: {
return new TemporalLocalDateTimeSerializer(objectStructureWrapper, property);
}
case TemporalZonedDateTime: {
return new TemporalZonedDateTimeSerializer(objectStructureWrapper, property);
}
case TemporalInstant: {
return new TemporalInstantSerializer(objectStructureWrapper, property);
}
default: {
throw new UnsupportedOperationException();
}
}
}

protected void createDefaultTemplate() {
}

// check
protected abstract void checkClass(ObjectStructureWrapper objectStructureWrapper);

protected void serialize(Object value, Writer writer, JsonConfig jsonConfig, int indent) throws Exception {
if (useTemplate) {
writeTemporalWithTemplate(value, writer, jsonConfig);
} else {
String temporal = value.toString();
STRING.serialize(temporal, writer, jsonConfig, indent);
}
}

protected abstract void writeTemporalWithTemplate(Object value, Writer writer, JsonConfig jsonConfig) throws Exception;
}
Loading

0 comments on commit edda136

Please sign in to comment.