// ================================================================================================================ // INTERNAL INTERFACE --------------------------------------------------------------------------------------------- protected override void parseValueFromInput() { ParsingState parsingState = ParsingState.Start; char c; int i = 0; string key = "undefined"; JSONValue valueObject; value = new Dictionary <string, object>(); while (i < input.Length && parsingState != ParsingState.End) { c = input.ToString(inputStart + i, 1)[0]; // TODO: is this efficient? switch (parsingState) { case ParsingState.Start: if (c == CHAR_START) { // Starting object parsingState = ParsingState.BeforeKey; } else { Debug.LogError("Invalid character \"" + c + "\" when expecting object key start"); } break; case ParsingState.BeforeKey: if (!JSONParser.isWhitespace(c)) { if (JSONString.matchesInput(input, inputStart + i)) { // Key starting JSONString keyObject = new JSONString(input, inputStart + i); key = (string)keyObject.getValue(); i += keyObject.getInputLength() - 1; parsingState = ParsingState.AfterKey; } else if (c == CHAR_END) { // Premature end parsingState = ParsingState.End; } else { Debug.LogError("Invalid character \"" + c + "\" when expecting object key name"); } } break; case ParsingState.AfterKey: if (!JSONParser.isWhitespace(c)) { if (c == CHAR_KEY_SEPARATOR) { parsingState = ParsingState.BeforeValue; } else { Debug.LogError("Invalid character \"" + c + "\" when expecting object key separator"); } } break; case ParsingState.BeforeValue: if (!JSONParser.isWhitespace(c)) { valueObject = JSONParser.parse(input, inputStart + i); i += valueObject.getInputLength() - 1; value.Add(key, valueObject.getValue()); parsingState = ParsingState.AfterValue; } break; case ParsingState.AfterValue: if (!JSONParser.isWhitespace(c)) { if (c == CHAR_END) { parsingState = ParsingState.End; } else if (c == CHAR_ITEM_SEPARATOR) { parsingState = ParsingState.BeforeKey; } else { Debug.LogError("Invalid character \"" + c + "\" when expecting object key end"); } } break; } i++; } inputLength = i; }