public JSONReader readNext()

in core/src/main/java/com/jetbrains/youtrackdb/internal/core/serialization/serializer/JSONReader.java [192:297]


  public JSONReader readNext(
      final char[] iUntil,
      final boolean iInclude,
      final char[] iJumpChars,
      final char[] iSkipChars,
      boolean preserveQuotes)
      throws IOException, ParseException {
    if (!in.ready()) {
      return this;
    }

    jump(iJumpChars);

    if (!in.ready()) {
      return this;
    }

    // READ WHILE THERE IS SOMETHING OF AVAILABLE
    var openBrackets = 0;
    var beginStringChar = ' ';
    var encodeMode = false;
    boolean found;
    do {
      found = false;
      if (beginStringChar == ' ') {
        // NO INSIDE A STRING
        if (openBrackets == 0) {
          // FIND FOR SEPARATOR
          for (var u : iUntil) {
            if (u == c) {
              found = true;
              break;
            }
          }
        }

        if (c == '\'' || c == '"' && !encodeMode)
        // BEGIN OF STRING
        {
          beginStringChar = c;
        } else if (c == '{')
        // OPEN EMBEDDED
        {
          openBrackets++;
        } else if (c == '}' && openBrackets > 0)
        // CLOSE EMBEDDED
        {
          openBrackets--;
        }

        if (!found && openBrackets == 0) {
          // FIND FOR SEPARATOR
          for (var u : iUntil) {
            if (u == c) {
              found = true;
              break;
            }
          }
        }
      } else if (beginStringChar == c && !encodeMode)
      // END OF STRING
      {
        beginStringChar = ' ';
      }

      encodeMode = c == '\\' && !encodeMode;

      if (!found) {
        final var read = nextChar();
        if (read == -1) {
          break;
        }

        // APPEND IT
        c = (char) read;

        var skip = false;
        if (iSkipChars != null) {
          for (var j : iSkipChars) {
            if (j == c) {
              skip = true;
              break;
            }
          }
        }

        if (!skip && (preserveQuotes || !encodeMode)) {
          lastCharacter = c;
          buffer.append(c);
        }
      }

    } while (!found && in.ready());

    if (buffer.length() == 0) {
      throw new ParseException(
          "Expected characters '" + Arrays.toString(iUntil) + "' not found", cursor);
    }

    if (!iInclude) {
      buffer.setLength(buffer.length() - 1);
    }

    value = buffer.toString();
    return this;
  }