PageRenderTime 72ms CodeModel.GetById 32ms RepoModel.GetById 1ms app.codeStats 0ms

/src/main/java/com/alibaba/fastjson/parser/deserializer/AbstractDateDeserializer.java

https://bitbucket.org/xiejuntao/xdesktop
Java | 99 lines | 79 code | 20 blank | 0 comment | 30 complexity | 5f243ceb3d29f7a8b4f82a6c984acdaf MD5 | raw file
  1. package com.alibaba.fastjson.parser.deserializer;
  2. import java.lang.reflect.Type;
  3. import com.alibaba.fastjson.JSONException;
  4. import com.alibaba.fastjson.parser.DefaultJSONParser;
  5. import com.alibaba.fastjson.parser.Feature;
  6. import com.alibaba.fastjson.parser.JSONScanner;
  7. import com.alibaba.fastjson.parser.JSONToken;
  8. import com.alibaba.fastjson.util.TypeUtils;
  9. public abstract class AbstractDateDeserializer implements ObjectDeserializer {
  10. @SuppressWarnings("unchecked")
  11. public <T> T deserialze(DefaultJSONParser parser, Type clazz, Object fieldName) {
  12. JSONScanner lexer = (JSONScanner) parser.getLexer();
  13. Object val;
  14. if (lexer.token() == JSONToken.LITERAL_INT) {
  15. val = lexer.longValue();
  16. lexer.nextToken(JSONToken.COMMA);
  17. } else if (lexer.token() == JSONToken.LITERAL_STRING) {
  18. String strVal = lexer.stringVal();
  19. val = strVal;
  20. lexer.nextToken(JSONToken.COMMA);
  21. if (lexer.isEnabled(Feature.AllowISO8601DateFormat)) {
  22. JSONScanner iso8601Lexer = new JSONScanner(strVal);
  23. if (iso8601Lexer.scanISO8601DateIfMatch()) {
  24. val = iso8601Lexer.getCalendar().getTime();
  25. }
  26. }
  27. } else if (lexer.token() == JSONToken.NULL) {
  28. lexer.nextToken();
  29. val = null;
  30. } else if (lexer.token() == JSONToken.LBRACE) {
  31. lexer.nextToken();
  32. String key;
  33. if (lexer.token() == JSONToken.LITERAL_STRING) {
  34. key = lexer.stringVal();
  35. if ("@type".equals(key)) {
  36. lexer.nextToken();
  37. parser.accept(JSONToken.COLON);
  38. String typeName = lexer.stringVal();
  39. Class<?> type = TypeUtils.loadClass(typeName);
  40. if (type != null) {
  41. clazz = type;
  42. }
  43. parser.accept(JSONToken.LITERAL_STRING);
  44. parser.accept(JSONToken.COMMA);
  45. }
  46. lexer.nextTokenWithColon(JSONToken.LITERAL_INT);
  47. } else {
  48. throw new JSONException("syntax error");
  49. }
  50. long timeMillis;
  51. if (lexer.token() == JSONToken.LITERAL_INT) {
  52. timeMillis = lexer.longValue();
  53. lexer.nextToken();
  54. } else {
  55. throw new JSONException("syntax error : " + lexer.tokenName());
  56. }
  57. val = timeMillis;
  58. parser.accept(JSONToken.RBRACE);
  59. } else if (parser.getResolveStatus() == DefaultJSONParser.TypeNameRedirect) {
  60. parser.setResolveStatus(DefaultJSONParser.NONE);
  61. parser.accept(JSONToken.COMMA);
  62. if (lexer.token() == JSONToken.LITERAL_STRING) {
  63. if (!"val".equals(lexer.stringVal())) {
  64. throw new JSONException("syntax error");
  65. }
  66. lexer.nextToken();
  67. } else {
  68. throw new JSONException("syntax error");
  69. }
  70. parser.accept(JSONToken.COLON);
  71. val = parser.parse();
  72. parser.accept(JSONToken.RBRACE);
  73. } else {
  74. val = parser.parse();
  75. }
  76. return (T) cast(parser, clazz, fieldName, val);
  77. }
  78. protected abstract <T> T cast(DefaultJSONParser parser, Type clazz, Object fieldName, Object value);
  79. }