Exemplo n.º 1
0
    Result ParseObject(ref Context con, ref JsonValue value)
    {
        if (string.IsNullOrEmpty(con.json))
        {
            return(Result.EXPECT_VALUE);
        }
        if (con.json[con.pos] != '{')
        {
            return(Result.INVALID_VALUE);
        }
        if (con.json[con.pos + 1] == '}')
        {
            con.pos += 2;
            value.SetType(ValueType.OBJECT);
            value.ClearObject();
            return(Result.PARSE_OK);
        }
        con.pos++;
        string keyName = null;

        while (true)
        {
            if (con.json[con.pos] == ':')
            {
                if (keyName == null)
                {
                    return(Result.MISS_KEY);
                }
                con.pos++;
            }
            else if (con.json[con.pos] == ',')
            {
                con.pos++;
                keyName = null;
            }
            else if (con.json[con.pos] == '}')
            {
                con.pos++;
                value.SetType(ValueType.OBJECT);
                return(Result.PARSE_OK);
            }
            else if (con.json[con.pos] == ' ')
            {
                con.pos++;
            }
            else
            {
                JsonValue temp = new JsonValue(ValueType.NULL);
                if (con.json[con.pos] == '\"')
                {
                    Result res = ParseValue(ref con, ref temp);
                    if (res != Result.PARSE_OK)
                    {
                        return(res);
                    }
                    if (keyName == null)
                    {
                        if (temp.GetType() != ValueType.STRING)
                        {
                            return(Result.MISS_KEY);
                        }
                        keyName = ((string)temp.GetValue());
                    }
                    else
                    {
                        value.AddKeyValue(keyName, temp);
                    }
                }
                else
                {
                    Result res = ParseValue(ref con, ref temp);
                    if (res != Result.PARSE_OK)
                    {
                        return(res);
                    }
                    if (keyName == null)
                    {
                        return(Result.MISS_KEY);
                    }
                    value.AddKeyValue(keyName, temp);
                }
            }
        }
    }