parseJSONStructure static method
The parser method: uses lexical and syntactical analysis to traverse the string and construct the JSON object graph.
Implementation
static dynamic parseJSONStructure(int depth, bool debugMode,
{Object? Function(Object?, Object?)? reviver}) {
depth++;
dynamic jsonObject;
skipSpace();
if (index == 0) {
read();
}
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [0] index, look ==>> '
'$index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if (look == "{") {
jsonObject = Map<String, dynamic>();
while (look != "}") {
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [0] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
read();
if (debugMode) {
logger.log(
'+++++++++++++++++-++++++++++++ [0.1] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
skipSpace();
if (look != '}') {
if (look != '"') {
read(indexPos: index++);
}
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [0.2] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
match('"');
read();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [1] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
String expressionKey = getExpressionKey();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [2] expressionKey, index, look ==>> $expressionKey, $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
match('"');
read();
index = DynamoCommons.skipSpace(inputString, index);
read(indexPos: index++);
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [3] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
match(':');
read();
skipSpace();
bool isStringValue = false;
if (!DynamoCommons.isDigit(look) &&
look != "-" &&
look != "{" &&
look != "[") {
if (look == '"') {
isStringValue = true;
}
if (!DynamoCommons.isAlpha(look)) {
read(indexPos: index);
}
}
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [4] index, look, inputString[index] ==>> $index, $look, ${inputString[index]}, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if ((DynamoCommons.isDigit(look) || look == "-") &&
(!isStringValue)) {
String expressionValue = getExpressionValue(true);
if (DynamoCommons.isDigitSequence(expressionValue)) {
jsonObject.putIfAbsent(
expressionKey, () => int.parse(expressionValue));
} else if (DynamoCommons.isDigitSequenceWithADot(expressionValue)) {
jsonObject.putIfAbsent(
expressionKey, () => double.parse(expressionValue));
}
if ((look == ']') || (look == '}')) {
index++;
}
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [5] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if (reviver != null) {
reviver(expressionKey, expressionValue);
}
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [6] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
} else if ((DynamoCommons.isAlpha(look)) && (!isStringValue)) {
String expressionValue = getNonStrExpressionValue();
jsonObject.putIfAbsent(expressionKey, () => expressionValue);
skipSpace();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [5a.1] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if (reviver != null) {
reviver(expressionKey, expressionValue);
}
} else if ((look != '{') && (look != '[')) {
String expressionValue = getExpressionValue(false);
jsonObject.putIfAbsent(expressionKey, () => expressionValue);
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [5b.1] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
match('"');
read();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [5b.2] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if (look == '"') {
read();
}
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [5b.3] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
skipSpace();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [5b.4] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if (reviver != null) {
reviver(expressionKey, expressionValue);
}
} else if ((look == '{') || (look == '[')) {
dynamic expressionValue =
parseJSONStructure(depth, debugMode, reviver: reviver);
jsonObject.putIfAbsent(expressionKey, () => expressionValue);
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [5c.1] expressionKey, index, look ==>> $expressionKey, $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
read();
skipSpace();
if ((look == '}') &&
(depth == 1) &&
(index < inputString.length - 1)) {
read();
skipSpace();
}
if (debugMode) {
logger.log(
'++++++++++++++++-+++++++++++++ [5c.2] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if (reviver != null) {
reviver(expressionKey, expressionValue);
}
}
}
}
} else if (look == "[") {
jsonObject = <dynamic>[];
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[00] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
while (look != "]") {
read();
skipSpace();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[001] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if (look == "]") {
skipSpace();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[002] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
} else if (look == "{") {
Map<String, dynamic> childJsonObject = {};
while (look != "}") {
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[0] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
read();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[0.1] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
skipSpace();
if (look != "}") {
while (look != '"') {
read(indexPos: index++);
}
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[0.2] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
match('"');
read();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[1] index, look, context ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
String expressionKey = getExpressionKey();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[2] expressionKey, index, look ==>> $expressionKey, $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
match('"');
read();
//skipSpace();
index = DynamoCommons.skipSpace(inputString, index);
read(indexPos: index++);
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[3] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
match(':');
read();
skipSpace();
bool isStringValue = false;
if (!DynamoCommons.isDigit(look) &&
look != "-" &&
look != "{" &&
look != "[") {
if (look == '"') {
isStringValue = true;
read(indexPos: index);
}
}
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[4] index, look, inputString[index] ==>> $index, $look, ${inputString[index]}, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if ((DynamoCommons.isDigit(look) || look == "-") &&
(!isStringValue)) {
String expressionValue = getExpressionValue(true);
if (DynamoCommons.isDigitSequence(expressionValue)) {
childJsonObject.putIfAbsent(
expressionKey, () => int.parse(expressionValue));
} else if (DynamoCommons.isDigitSequenceWithADot(
expressionValue)) {
childJsonObject.putIfAbsent(
expressionKey, () => double.parse(expressionValue));
}
if ((look == ']') || (look == '}')) {
index++;
}
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[5] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if (reviver != null) {
reviver(expressionKey, expressionValue);
}
} else if ((DynamoCommons.isAlpha(look)) && (!isStringValue)) {
String expressionValue = getNonStrExpressionValue();
childJsonObject.putIfAbsent(
expressionKey, () => expressionValue);
skipSpace();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [5a.2] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if (reviver != null) {
reviver(expressionKey, expressionValue);
}
} else if ((look != '{') && (look != '[')) {
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[4b] index, look, expressionKey ==>> $index, $look, $expressionKey',
logLevel: LogLevel.debug,
);
}
String expressionValue = getExpressionValue(false);
childJsonObject.putIfAbsent(
expressionKey, () => expressionValue);
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[5b] index, look, expressionValue ==>> $index, $look, $expressionValue',
logLevel: LogLevel.debug,
);
}
match('"');
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[6b] index, look, expressionValue ==>> $index, $look, $expressionValue',
logLevel: LogLevel.debug,
);
}
read();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[6c] index, look, expressionValue ==>> $index, $look, $expressionValue',
logLevel: LogLevel.debug,
);
}
skipSpace();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[6d] index, look, expressionValue ==>> $index, $look, $expressionValue',
logLevel: LogLevel.debug,
);
}
if (look == '"') {
read();
skipSpace();
}
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[7a] index, look, expressionValue ==>> $index, $look, $expressionValue',
logLevel: LogLevel.debug,
);
}
if (reviver != null) {
reviver(expressionKey, expressionValue);
}
} else if ((look == '{') || (look == '[')) {
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[7b.0] index, look, expressionKey ==>> $index, $look, $expressionKey, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
dynamic expressionValue =
parseJSONStructure(depth, debugMode, reviver: reviver);
childJsonObject.putIfAbsent(
expressionKey, () => expressionValue);
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[7b.1] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
read();
skipSpace();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[7b.2] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if (reviver != null) {
reviver(expressionKey, expressionValue);
}
}
}
}
jsonObject.add(childJsonObject);
read();
skipSpace();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[6] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if (look == '}') {
read();
skipSpace();
//index = DynamoCommons.skipSpace(inputString, index);
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <T>[7] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
}
} else if (look == '[') {
dynamic expressionValue =
parseJSONStructure(depth, debugMode, reviver: reviver);
jsonObject.add(expressionValue);
read();
skipSpace();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <TT>[5c.2] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
} else {
bool isStringValue = false;
if (!DynamoCommons.isDigit(look) &&
look != "-" &&
look != "{" &&
look != "[") {
if (look == '"') {
isStringValue = true;
read(indexPos: index);
}
if (DynamoCommons.isDigit(look) || look == "-") {
if (index < inputString.length - 1) {
index++;
}
}
}
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <S>[4] index, look, inputString[index] ==>> $index, $look, ${inputString[index]}, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
if ((DynamoCommons.isDigit(look) || look == "-") &&
(!isStringValue)) {
String expressionValue = getExpressionValue(true);
if (DynamoCommons.isDigitSequence(expressionValue)) {
jsonObject.add(int.parse(expressionValue));
} else if (DynamoCommons.isDigitSequenceWithADot(expressionValue)) {
jsonObject.add(double.parse(expressionValue));
}
if ((look == ']') || (look == '}')) {
index++;
}
skipSpace();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <S>[5] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
} else if ((DynamoCommons.isAlpha(look)) && (!isStringValue)) {
String expressionValue = getNonStrExpressionValue();
jsonObject.add(expressionValue);
skipSpace();
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ [5a.1] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
} else if (isStringValue) {
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <S>[1] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
String expressionValue = getExpressionValue(false);
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <S>[2] index, look, expressionValue ==>> $index, $look, $expressionValue, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
read();
skipSpace();
jsonObject.add(expressionValue);
if (debugMode) {
logger.log(
'+++++++++++++++++++++++++++++ <S>[3] index, look ==>> $index, $look, ${showConttext(depth)}',
logLevel: LogLevel.debug,
);
}
}
}
}
}
return jsonObject;
}