Esempio n. 1
0
        /// <summary>
        /// 设置字符状态(返回true则为关键词,返回false则当为普通字符处理)
        /// </summary>
        private static bool SetCharState(char c, ref CharState cs)
        {
            switch (c)
            {
            case '{':    //[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}]
                #region 大括号
                if (cs.keyStart <= 0 && cs.valueStart <= 0)
                {
                    cs.CheckIsError(c);
                    if (cs.jsonStart && cs.state == 1)
                    {
                        cs.valueStart    = 0;
                        cs.childrenStart = true;
                    }
                    else
                    {
                        cs.state = 0;
                    }
                    cs.jsonStart = true;    //开始。
                    return(true);
                }
                #endregion
                break;

            case '}':
                #region 大括号结束
                if (cs.keyStart <= 0 && cs.valueStart < 2)
                {
                    cs.CheckIsError(c);
                    if (cs.jsonStart)
                    {
                        cs.jsonStart   = false;  //正常结束。
                        cs.valueStart  = -1;
                        cs.state       = 0;
                        cs.setDicValue = true;
                    }
                    return(true);
                }
                // cs.isError = !cs.jsonStart && cs.state == 0;
                #endregion
                break;

            case '[':
                #region 中括号开始
                if (!cs.jsonStart)
                {
                    cs.CheckIsError(c);
                    cs.arrayStart = true;
                    return(true);
                }
                else if (cs.jsonStart && cs.state == 1 && cs.valueStart < 2)
                {
                    cs.CheckIsError(c);
                    //cs.valueStart = 1;
                    cs.childrenStart = true;
                    return(true);
                }
                #endregion
                break;

            case ']':
                #region 中括号结束
                if (!cs.jsonStart && (cs.keyStart <= 0 && cs.valueStart <= 0) || (cs.keyStart == -1 && cs.valueStart == 1))
                {
                    cs.CheckIsError(c);
                    if (cs.arrayStart)    // && !cs.childrenStart
                    {
                        cs.arrayStart = false;
                    }
                    return(true);
                }
                #endregion
                break;

            case '"':
            case '\'':
                cs.CheckIsError(c);
                #region 引号
                if (cs.jsonStart || cs.arrayStart)
                {
                    if (!cs.jsonStart && cs.arrayStart)
                    {
                        cs.state = 1;    //如果是数组,只有取值,没有Key,所以直接跳过0
                    }
                    if (cs.state == 0)   //key阶段
                    {
                        cs.keyStart = (cs.keyStart <= 0 ? (c == '"' ? 3 : 2) : -2);
                        return(true);
                    }
                    else if (cs.state == 1)    //值阶段
                    {
                        if (cs.valueStart <= 0)
                        {
                            cs.valueStart = (c == '"' ? 3 : 2);
                            return(true);
                        }
                        else if ((cs.valueStart == 2 && c == '\'') || (cs.valueStart == 3 && c == '"'))
                        {
                            if (!cs.escapeChar)
                            {
                                cs.valueStart = -2;
                                return(true);
                            }
                            else
                            {
                                cs.escapeChar = false;
                            }
                        }
                    }
                }
                #endregion
                break;

            case ':':
                cs.CheckIsError(c);
                #region 冒号
                if (cs.jsonStart && cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 0)
                {
                    cs.keyStart = 0;
                    cs.state    = 1;
                    return(true);
                }
                #endregion
                break;

            case ',':
                cs.CheckIsError(c);
                #region 逗号 {"a": [11,"22", ], "Type": 2}
                if (cs.jsonStart && cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1)
                {
                    cs.state       = 0;
                    cs.valueStart  = 0;
                    cs.setDicValue = true;
                    return(true);
                }
                else if (cs.arrayStart && !cs.jsonStart)     //[a,b]  [",",33] [{},{}]
                {
                    if ((cs.state == -1 && cs.valueStart == -1) || (cs.valueStart < 2 && cs.state == 1))
                    {
                        cs.valueStart = 0;
                        return(true);
                    }
                }
                #endregion
                break;

            case ' ':
            case '\r':
            case '\n':
            case '\t':
                if (cs.jsonStart && cs.keyStart <= 0 && cs.valueStart <= 0)
                {
                    return(true);   //跳过空格。
                }
                break;

            default:           //值开头。。
                cs.CheckIsError(c);
                if (c == '\\') //转义符号
                {
                    if (cs.escapeChar)
                    {
                        cs.escapeChar = false;
                    }
                    else
                    {
                        cs.escapeChar = true;
                        //return true;
                    }
                }
                else
                {
                    cs.escapeChar = false;
                }
                if (cs.jsonStart)
                {
                    if (cs.keyStart <= 0 && cs.state <= 0)
                    {
                        cs.keyStart = 1;    //无引号的
                    }
                    else if (cs.valueStart <= 0 && cs.state == 1)
                    {
                        cs.valueStart = 1;    //无引号的
                    }
                }
                else if (cs.arrayStart)
                {
                    cs.state = 1;
                    if (cs.valueStart < 1)
                    {
                        cs.valueStart = 1;    //无引号的
                    }
                }
                break;
            }
            return(false);
        }