-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
1、支持LocalDate,LocalDateTime,LocalTime, ZonedDateTime,Instant的JSON序列化和反序列化字符串处理; 2、日期类支持夏令时及性能优化; 3、HttpClient读取流优化;
- Loading branch information
wangyunchao
committed
Aug 21, 2022
1 parent
eef6067
commit edda136
Showing
18 changed files
with
2,195 additions
and
0 deletions.
There are no files selected for viewing
427 changes: 427 additions & 0 deletions
427
src/main/java/io/github/wycst/wast/common/beans/GeneralDate.java
Large diffs are not rendered by default.
Oops, something went wrong.
109 changes: 109 additions & 0 deletions
109
src/main/java/io/github/wycst/wast/json/JSONTemporalDeserializer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
85 changes: 85 additions & 0 deletions
85
src/main/java/io/github/wycst/wast/json/JSONTemporalSerializer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
Oops, something went wrong.