@SuppressWarnings("unchecked")
  public static <T> T deserialze(DefaultJSONParser parser) {
    final JSONLexer lexer = parser.getLexer();
    if (lexer.token() == JSONToken.LITERAL_INT) {
      String val = lexer.numberString();
      lexer.nextToken(JSONToken.COMMA);
      return (T) new BigInteger(val);
    }

    Object value = parser.parse();

    if (value == null) {
      return null;
    }

    return (T) TypeUtils.castToBigInteger(value);
  }
  @SuppressWarnings("unchecked")
  public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
    JSONLexer lexer = parser.getLexer();

    if (lexer.token() == JSONToken.NULL) {
      lexer.nextToken(JSONToken.COMMA);
      return null;
    }

    if (lexer.token() != JSONToken.LBRACE && lexer.token() != JSONToken.COMMA) {
      throw new JSONException("syntax error");
    }
    lexer.nextToken();

    int size = 0, style = 0;
    String name = null;
    for (; ; ) {
      if (lexer.token() == JSONToken.RBRACE) {
        lexer.nextToken();
        break;
      }

      String key;
      if (lexer.token() == JSONToken.LITERAL_STRING) {
        key = lexer.stringVal();
        lexer.nextTokenWithColon(JSONToken.LITERAL_INT);
      } else {
        throw new JSONException("syntax error");
      }

      if (key.equalsIgnoreCase("name")) {
        if (lexer.token() == JSONToken.LITERAL_STRING) {
          name = lexer.stringVal();
          lexer.nextToken();
        } else {
          throw new JSONException("syntax error");
        }
      } else if (key.equalsIgnoreCase("style")) {
        if (lexer.token() == JSONToken.LITERAL_INT) {
          style = lexer.intValue();
          lexer.nextToken();
        } else {
          throw new JSONException("syntax error");
        }
      } else if (key.equalsIgnoreCase("size")) {
        if (lexer.token() == JSONToken.LITERAL_INT) {
          size = lexer.intValue();
          lexer.nextToken();
        } else {
          throw new JSONException("syntax error");
        }
      } else {
        throw new JSONException("syntax error, " + key);
      }

      if (lexer.token() == JSONToken.COMMA) {
        lexer.nextToken(JSONToken.LITERAL_STRING);
      }
    }

    return (T) new Font(name, style, size);
  }