docs: @Nullable
      public JsonToken next() throws IOException, JsonException {
          if (unreadToken != null) {
              JsonToken tmp = unreadToken;
              unreadToken = null;
              return tmp;
          }
  
          while (lastChar >= 0) {
              if (lastChar == 0) {
                  if (!readNextChar()) {
                      break;
                  }
              }
              if (lastChar == JsonToken.kNewLine ||
                  lastChar == JsonToken.kCarriageReturn ||
                  lastChar == JsonToken.kSpace ||
                  lastChar == JsonToken.kTab) {
                  lastChar = 0;
                  continue;
              }
  
              if (lastChar == JsonToken.kDoubleQuote) {
                  return nextString();
              } else if (lastChar == '.' || lastChar == '-' || (lastChar >= '0' && lastChar <= '9')) {
                  return nextNumber();
              } else if (lastChar == '_' ||
                         (lastChar >= 'a' && lastChar <= 'z') ||
                         (lastChar >= 'A' && lastChar <= 'Z')) {
                  return nextToken();
              } else if (lastChar < 0x20 || lastChar >= 0x7F) {
                  // UTF-8 characters are only allowed inside JSON string literals.
                  throw newParseException("Illegal character in JSON structure: '\\u%04x'", lastChar);
              } else {
                  return nextSymbol();
              }
          }
  
          return null;
      }