48348 {
48349 separators.clear();
48350 state = JSONState::REGULAR;
48351 char quote_char = '"';
48352 bool can_parse_value = false;
48353 bool in_unquoted_value = false;
48354 pos = 0;
48355 for (; success && pos < value.size(); pos++) {
48356 auto c = value[pos];
48357 if (state == JSONState::REGULAR) {
48358 if (can_parse_value) {
48359
48360 if (pos + 4 < value.size() && StringUtil::CharacterToLower(c) == 'n' &&
48361 StringUtil::CharacterToLower(value[pos + 1]) == 'u' &&
48362 StringUtil::CharacterToLower(value[pos + 2]) == 'l' &&
48363 StringUtil::CharacterToLower(value[pos + 3]) == 'l') {
48364 HandleNull();
48365 pos += 3;
48366 continue;
48367 }
48368 }
48369 switch (c) {
48370 case '[':
48371 case '{': {
48372
48373 separators.push_back(c);
48374 HandleBracketOpen(c);
48375 can_parse_value = c == '[';
48376 break;
48377 }
48378 case '}':
48379 case ']': {
48380
48381 if (separators.empty() || !SeparatorIsMatching(separators.back(), c)) {
48382 throw InternalException("Failed to parse JSON string %s - invalid JSON", value);
48383 }
48384 separators.pop_back();
48385 HandleBracketClose(c);
48386 in_unquoted_value = false;
48387 break;
48388 }
48389 case '"':
48390 case '\'':
48391 HandleQuoteStart(c);
48392 quote_char = c;
48393 state = JSONState::IN_QUOTE;
48394 break;
48395 case ',':
48396
48397 HandleComma(c);
48398 in_unquoted_value = false;
48399 break;
48400 case ':':
48401 HandleColon();
48402 can_parse_value = true;
48403 break;
48404 case '\\':
48405
48406 if (pos + 1 < value.size() && IsWhitespaceEscape(value[pos + 1])) {
48407 pos++;
48408 break;
48409 }
48410
48411 HandleCharacter(c);
48412 break;
48413 case ' ':
48414 if (in_unquoted_value) {
48415 HandleCharacter(c);
48416 }
48417 break;
48418 case '\t':
48419 case '\n':
48420
48421 break;
48422 default:
48423 in_unquoted_value = true;
48424 HandleCharacter(c);
48425 break;
48426 }
48427 } else if (state == JSONState::IN_QUOTE) {
48428 if (c == quote_char) {
48429
48430 state = JSONState::REGULAR;
48431 HandleQuoteEnd(c);
48432 } else if (c == '\\') {
48433
48434 state = JSONState::ESCAPE;
48435 HandleEscapeStart(c);
48436 } else {
48437 HandleCharacter(c);
48438 }
48439 } else if (state == JSONState::ESCAPE) {
48440 state = JSONState::IN_QUOTE;
48441 HandleCharacter(c);
48442 } else {
48443 throw InternalException("Invalid json state");
48444 }
48445 }
48446 if (!success) {
48447 return false;
48448 }
48449 Finish();
48450 return true;
48451}