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;
}