/// <summary>
        /// 设置字符状态(返回true则为关键词,返回false则当为普通字符处理)
        /// </summary>
        private static bool SetCharState(char c, ref CharState cs)
        {
            cs.CheckIsError(c);
            switch (c)
            {
            case '{':     //[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}]

                #region 大括号

                if (cs.keyStart <= 0 && cs.valueStart <= 0)
                {
                    cs.keyStart   = 0;
                    cs.valueStart = 0;
                    if (cs.jsonStart && cs.state == 1)
                    {
                        cs.childrenStart = true;
                    }
                    else
                    {
                        cs.state = 0;
                    }
                    cs.jsonStart = true;     //开始。
                    return(true);
                }

                #endregion

                break;

            case '}':

                #region 大括号结束

                if (cs.keyStart <= 0 && cs.valueStart < 2 && cs.jsonStart)
                {
                    cs.jsonStart   = false;   //正常结束。
                    cs.state       = 0;
                    cs.keyStart    = 0;
                    cs.valueStart  = 0;
                    cs.setDicValue = true;
                    return(true);
                }
                // cs.isError = !cs.jsonStart && cs.state == 0;

                #endregion

                break;

            case '[':

                #region 中括号开始

                if (!cs.jsonStart)
                {
                    cs.arrayStart = true;
                    return(true);
                }
                else if (cs.jsonStart && cs.state == 1)
                {
                    cs.childrenStart = true;
                    return(true);
                }

                #endregion

                break;

            case ']':

                #region 中括号结束

                if (cs.arrayStart && !cs.jsonStart && cs.keyStart <= 2 && cs.valueStart <= 0)     //[{},333]//这样结束。
                {
                    cs.keyStart   = 0;
                    cs.valueStart = 0;
                    cs.arrayStart = false;
                    return(true);
                }

                #endregion

                break;

            case '"':
            case '\'':

                #region 引号

                if (cs.jsonStart || cs.arrayStart)
                {
                    if (cs.state == 0)     //key阶段,有可能是数组["aa",{}]
                    {
                        if (cs.keyStart <= 0)
                        {
                            cs.keyStart = (c == '"' ? 3 : 2);
                            return(true);
                        }
                        else if ((cs.keyStart == 2 && c == '\'') || (cs.keyStart == 3 && c == '"'))
                        {
                            if (!cs.escapeChar)
                            {
                                cs.keyStart = -1;
                                return(true);
                            }
                            else
                            {
                                cs.escapeChar = false;
                            }
                        }
                    }
                    else if (cs.state == 1 && cs.jsonStart)     //值阶段必须是Json开始了。
                    {
                        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 = -1;
                                return(true);
                            }
                            else
                            {
                                cs.escapeChar = false;
                            }
                        }
                    }
                }

                #endregion

                break;

            case ':':

                #region 冒号

                if (cs.jsonStart && cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 0)
                {
                    if (cs.keyStart == 1)
                    {
                        cs.keyStart = -1;
                    }
                    cs.state = 1;
                    return(true);
                }
                // cs.isError = !cs.jsonStart || (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1);

                #endregion

                break;

            case ',':

                #region 逗号     //["aa",{aa:12,}]

                if (cs.jsonStart)
                {
                    if (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1)
                    {
                        cs.state      = 0;
                        cs.keyStart   = 0;
                        cs.valueStart = 0;
                        //if (cs.valueStart == 1)
                        //{
                        //    cs.valueStart = 0;
                        //}
                        cs.setDicValue = true;
                        return(true);
                    }
                }
                else if (cs.arrayStart && cs.keyStart <= 2)
                {
                    cs.keyStart = 0;
                    //if (cs.keyStart == 1)
                    //{
                    //    cs.keyStart = -1;
                    //}
                    return(true);
                }

                #endregion

                break;

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

            default:           //值开头。。
                if (c == '\\') //转义符号
                {
                    if (cs.escapeChar)
                    {
                        cs.escapeChar = false;
                    }
                    else
                    {
                        cs.escapeChar = true;
                        return(true);
                    }
                }
                else
                {
                    cs.escapeChar = false;
                }
                if (cs.jsonStart || cs.arrayStart)     // Json 或数组开始了。
                {
                    if (cs.keyStart <= 0 && cs.state == 0)
                    {
                        cs.keyStart = 1;                                          //无引号的
                    }
                    else if (cs.valueStart <= 0 && cs.state == 1 && cs.jsonStart) //只有Json开始才有值。
                    {
                        cs.valueStart = 1;                                        //无引号的
                    }
                }
                break;
            }
            return(false);
        }
Beispiel #2
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 = 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.CheckIsError(c);
                        if (cs.arrayStart)// && !cs.childrenStart
                        {
                            cs.arrayStart = false;
                        }
                        return true;
                    }
                    #endregion
                    break;
                case '"':
                case '\'':
                    cs.CheckIsError(c);
                    #region ����
                    if (cs.jsonStart)
                    {
                        if (cs.state == 0)//key�׶�
                        {
                            cs.keyStart = (cs.keyStart <= 0 ? (c == '"' ? 3 : 2) : 0);
                            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 = 0;
                                    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;
                    }
                    // cs.isError = !cs.jsonStart || (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1);
                    #endregion
                    break;
                case ',':
                    cs.CheckIsError(c);
                    #region ����
                    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)
                    {
                        return true;
                    }
                    #endregion
                    break;
                case ' ':
                case '\r':
                case '\n':
                    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;//�����ŵ�
                        }
                    }
                    break;
            }
            return false;
        }
Beispiel #3
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 逗号 {"a": [11,"22", ], "Type": 2}

                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);
        }
            /// <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  = 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.CheckIsError(c);
                        if (cs.ArrayStart)    // && !cs.childrenStart
                        {
                            cs.ArrayStart = false;
                        }
                        return(true);
                    }
                    #endregion
                    break;

                case '"':
                case '\'':
                    cs.CheckIsError(c);
                    #region 引号
                    if (cs.JsonStart)
                    {
                        if (cs.State == 0)    //key阶段
                        {
                            cs.KeyStart = (cs.KeyStart <= 0 ? (c == '"' ? 3 : 2) : 0);
                            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 = 0;
                                    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);
                    }
                    // cs.isError = !cs.jsonStart || (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1);
                    #endregion
                    break;

                case ',':
                    cs.CheckIsError(c);
                    #region 逗号
                    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)
                    {
                        return(true);
                    }
                    #endregion
                    break;

                case ' ':
                case '\r':
                case '\n':
                    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;    //无引号的
                        }
                    }
                    break;
                }
                return(false);
            }