Пример #1
0
    // ================================================================================================================
    // 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;
    }