예제 #1
0
        /// <summary>
        /// 获取值的长度(当Json值嵌套以"{"或"["开头时)
        /// </summary>
        private static int GetValueLength(string json, bool breakOnErr, out int errIndex)
        {
            errIndex = 0;
            int len = 0;

            if (!string.IsNullOrEmpty(json))
            {
                CharState cs = new CharState();
                char      c;
                for (int i = 0; i < json.Length; i++)
                {
                    c = json[i];
                    if (!SetCharState(c, ref cs))            //设置关键符号状态。
                    {
                        if (!cs.jsonStart && !cs.arrayStart) //json结束,又不是数组,则退出。
                        {
                            break;
                        }
                    }
                    else if (cs.childrenStart)                                                    //正常字符,值状态下。
                    {
                        int length = GetValueLength(json.Substring(i), breakOnErr, out errIndex); //递归子值,返回一个长度。。。
                        cs.childrenStart = false;
                        cs.valueStart    = 0;
                        //cs.state = 0;
                        i = i + length - 1;
                    }
                    if (breakOnErr && cs.isError)
                    {
                        errIndex = i;
                        return(i);
                    }
                    if (!cs.jsonStart && !cs.arrayStart) //记录当前结束位置。
                    {
                        len = i + 1;                     //长度比索引+1
                        break;
                    }
                }
            }
            return(len);
        }
예제 #2
0
        /// <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 逗号     //["aa",{aa:12,}]

                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);
        }