/src/main/java/com/alibaba/fastjson/parser/deserializer/AbstractDateDeserializer.java
Java | 99 lines | 79 code | 20 blank | 0 comment | 30 complexity | 5f243ceb3d29f7a8b4f82a6c984acdaf MD5 | raw file
- package com.alibaba.fastjson.parser.deserializer;
- import java.lang.reflect.Type;
- import com.alibaba.fastjson.JSONException;
- import com.alibaba.fastjson.parser.DefaultJSONParser;
- import com.alibaba.fastjson.parser.Feature;
- import com.alibaba.fastjson.parser.JSONScanner;
- import com.alibaba.fastjson.parser.JSONToken;
- import com.alibaba.fastjson.util.TypeUtils;
- public abstract class AbstractDateDeserializer implements ObjectDeserializer {
- @SuppressWarnings("unchecked")
- public <T> T deserialze(DefaultJSONParser parser, Type clazz, Object fieldName) {
- JSONScanner lexer = (JSONScanner) parser.getLexer();
- Object val;
- if (lexer.token() == JSONToken.LITERAL_INT) {
- val = lexer.longValue();
- lexer.nextToken(JSONToken.COMMA);
- } else if (lexer.token() == JSONToken.LITERAL_STRING) {
- String strVal = lexer.stringVal();
- val = strVal;
- lexer.nextToken(JSONToken.COMMA);
-
- if (lexer.isEnabled(Feature.AllowISO8601DateFormat)) {
- JSONScanner iso8601Lexer = new JSONScanner(strVal);
- if (iso8601Lexer.scanISO8601DateIfMatch()) {
- val = iso8601Lexer.getCalendar().getTime();
- }
- }
- } else if (lexer.token() == JSONToken.NULL) {
- lexer.nextToken();
- val = null;
- } else if (lexer.token() == JSONToken.LBRACE) {
- lexer.nextToken();
-
- String key;
- if (lexer.token() == JSONToken.LITERAL_STRING) {
- key = lexer.stringVal();
-
- if ("@type".equals(key)) {
- lexer.nextToken();
- parser.accept(JSONToken.COLON);
-
- String typeName = lexer.stringVal();
- Class<?> type = TypeUtils.loadClass(typeName);
- if (type != null) {
- clazz = type;
- }
-
- parser.accept(JSONToken.LITERAL_STRING);
- parser.accept(JSONToken.COMMA);
- }
-
- lexer.nextTokenWithColon(JSONToken.LITERAL_INT);
- } else {
- throw new JSONException("syntax error");
- }
-
- long timeMillis;
- if (lexer.token() == JSONToken.LITERAL_INT) {
- timeMillis = lexer.longValue();
- lexer.nextToken();
- } else {
- throw new JSONException("syntax error : " + lexer.tokenName());
- }
-
- val = timeMillis;
-
- parser.accept(JSONToken.RBRACE);
- } else if (parser.getResolveStatus() == DefaultJSONParser.TypeNameRedirect) {
- parser.setResolveStatus(DefaultJSONParser.NONE);
- parser.accept(JSONToken.COMMA);
- if (lexer.token() == JSONToken.LITERAL_STRING) {
- if (!"val".equals(lexer.stringVal())) {
- throw new JSONException("syntax error");
- }
- lexer.nextToken();
- } else {
- throw new JSONException("syntax error");
- }
- parser.accept(JSONToken.COLON);
- val = parser.parse();
- parser.accept(JSONToken.RBRACE);
- } else {
- val = parser.parse();
- }
- return (T) cast(parser, clazz, fieldName, val);
- }
- protected abstract <T> T cast(DefaultJSONParser parser, Type clazz, Object fieldName, Object value);
- }