Exemplo n.º 1
0
 /// <summary>
 /// 获取或设置数值
 /// </summary>
 /// <param name="index"></param>
 /// <returns></returns>
 public bool this[int index] {
     get {
         if (_json.Count <= index + 1)
         {
             return(_json.Bool(index));
         }
         return(false);
     }
     set {
         _json.Bool(index, value);
     }
 }
Exemplo n.º 2
0
        /// <summary>
        /// 获取对象
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public static JsonUnit ParseJson(string json)
        {
            // 初始化操作对象为空
            JsonUnit res = null;
            JsonUnit jup = null;

            // 初始化字符串
            string        name  = null;
            string        value = null;
            StringBuilder sb    = new StringBuilder();

            // 初始化字符串和转义标志
            bool isString = false;
            bool isEscape = false;

            // unicode支持
            bool isUnicode = false;
            int  uLen      = 0;
            int  uCode     = 0;

            // 初始化操作类型为空操作
            int pt = Parse_Null;

            // 行列计数器
            int line = 1;
            int col  = 0;

            //try {

            //遍历字符串进行解析
            for (int i = 0; i < json.Length; i++)
            {
                col++;
                char chr = json[i];
                switch (chr)
                {
                case '{':
                    #region [=====处理左大括号=====]
                    if (isString)
                    {
                        // 此字符不支持转义及Unicode
                        if (isEscape)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        if (isUnicode)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        // 当处于字符串模式时,直接添加到字符串生成器
                        sb.Append(chr);
                    }
                    else
                    {
                        // 判断解析类型,必须为空
                        if (pt == Parse_Null)
                        {
                            // 当处于字符串模式时,则为添加一个对象
                            if (jup == null)
                            {
                                // 无操作对象时,为顶层操作对象,不允许有名称和值
                                if (!(name.IsNull() || value.IsNull()))
                                {
                                    throw new Exception($"规则外的\"{chr}\"操作符");
                                }
                                res = new JsonObject();
                                jup = res;
                            }
                            else
                            {
                                throw new Exception($"规则外的\"{chr}\"操作符");
                            }
                        }
                        else if (pt == Parse_Value)
                        {
                            // 父对象不允许为空
                            if (jup == null)
                            {
                                throw new Exception($"规则外的\"{chr}\"操作符");
                            }
                            // 设置子对象
                            if (jup.UnitType == UnitType.Object)
                            {
                                if (name.IsNoneOrNull())
                                {
                                    throw new Exception($"语法错误:名称不允许未空");
                                }
                                jup = jup.Object(name);
                            }
                            else if (jup.UnitType == UnitType.Array)
                            {
                                if (!name.IsNoneOrNull())
                                {
                                    throw new Exception($"语法错误:无效名称");
                                }
                                jup = jup.Object(jup.Count);
                            }
                            else
                            {
                                throw new Exception($"数据类型\"{jup.UnitType.ToString()}\"不支持设置子元素");
                            }
                            // 清理缓存
                            name = null;
                        }
                        else
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        // 解析类型设置为值
                        pt = Parse_Name;
                    }
                    break;

                    #endregion
                case '}':
                    #region [=====处理右大括号=====]
                    if (isString)
                    {
                        // 此字符不支持转义及Unicode
                        if (isEscape)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        if (isUnicode)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        // 当处于字符串模式时,直接添加到字符串生成器
                        sb.Append(chr);
                    }
                    else
                    {
                        // 特殊处理,如果当前为值解析,同时值为数值或null,则进行值设置操作
                        if (pt == Parse_Name)
                        {
                            // 判断是否已经定义名称
                            if (sb.Length > 0)
                            {
                                throw new Exception($"规则外的\"{chr}\"操作符");
                            }

                            // 清理缓存
                            sb.Clear();
                            name  = null;
                            value = null;
                        }
                        else if (pt == Parse_Value)
                        {
                            // 父对象不允许为空
                            if (jup == null)
                            {
                                throw new Exception($"规则外的\"{chr}\"操作符");
                            }

                            if (name.IsNoneOrNull())
                            {
                                throw new Exception($"规则外的\"{chr}\"操作符");
                            }
                            value = sb.ToString();
                            if (value == "null" || value == "Null" || value == "NULL")
                            {
                                // 添加NULL值
                                jup.String(name, null);
                            }
                            else if (value == "true" || value == "True" || value == "TRUE")
                            {
                                // 添加布尔值
                                jup.Bool(name, true);
                            }
                            else if (value == "false" || value == "False" || value == "FALSE")
                            {
                                // 添加布尔值
                                jup.Bool(name, false);
                            }
                            else if (value.IsDouble())
                            {
                                // 添加数值
                                jup.Number(name, value.ToDouble());
                            }
                            else
                            {
                                throw new Exception($"规则外的\"{chr}\"操作符");
                            }

                            // 清理缓存
                            sb.Clear();
                            name  = null;
                            value = null;
                        }
                        else if (pt == Parse_Done_Value)
                        {
                            // 添加字符串值
                            if (name.IsNoneOrNull())
                            {
                                throw new Exception($"语法错误:缺少名称");
                            }
                            jup.String(name, value);
                            // 清理缓存
                            sb.Clear();
                            name  = null;
                            value = null;
                        }
                        else if ((pt & Parse_Done) == Parse_Done)
                        {
                            // 完成状态时继续
                        }
                        else
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }

                        // 当前必须要有操作对象
                        if (jup == null)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        // 返回到上层对象
                        jup = jup.Parent;
                        // 解析类型设置为子对象操作完成
                        pt = Parse_Done_Object;
                    }
                    break;

                    #endregion
                case '[':
                    #region [=====处理左中括号=====]
                    if (isString)
                    {
                        // 此字符不支持转义及Unicode
                        if (isEscape)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        if (isUnicode)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        // 当处于字符串模式时,直接添加到字符串生成器
                        sb.Append(chr);
                    }
                    else
                    {
                        // 判断解析类型,必须为空
                        if (pt == Parse_Null)
                        {
                            // 当处于字符串模式时,则为添加一个对象
                            if (jup == null)
                            {
                                // 无操作对象时,为顶层操作对象,不允许有名称和值
                                if (!(name.IsNull() || value.IsNull()))
                                {
                                    throw new Exception($"规则外的\"{chr}\"操作符");
                                }
                                res = new JsonArray();
                                jup = res;
                            }
                            else
                            {
                                throw new Exception($"规则外的\"{chr}\"操作符");
                            }
                        }
                        else if (pt == Parse_Value)
                        {
                            // 父对象不允许为空
                            if (jup == null)
                            {
                                throw new Exception($"规则外的\"{chr}\"操作符");
                            }
                            // 设置子对象
                            if (jup.UnitType == UnitType.Object)
                            {
                                if (name.IsNoneOrNull())
                                {
                                    throw new Exception($"语法错误:名称不允许未空");
                                }
                                jup = jup.Array(name);
                            }
                            else if (jup.UnitType == UnitType.Array)
                            {
                                if (!name.IsNoneOrNull())
                                {
                                    throw new Exception($"语法错误:无效名称");
                                }
                                jup = jup.Array(jup.Count);
                            }
                            else
                            {
                                throw new Exception($"数据类型\"{jup.UnitType.ToString()}\"不支持设置子元素");
                            }
                            // 清理缓存
                            name = null;
                        }
                        else
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        // 解析类型设置为值
                        pt = Parse_Value;
                    }
                    break;

                    #endregion
                case ']':
                    #region [=====处理右中括号=====]
                    if (isString)
                    {
                        // 此字符不支持转义及Unicode
                        if (isEscape)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        if (isUnicode)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        // 当处于字符串模式时,直接添加到字符串生成器
                        sb.Append(chr);
                    }
                    else
                    {
                        // 特殊处理,如果当前为值解析,同时值为数值或null,则进行值设置操作
                        if (pt == Parse_Value)
                        {
                            // 父对象不允许为空
                            if (jup == null)
                            {
                                throw new Exception($"规则外的\"{chr}\"操作符");
                            }

                            if (!name.IsNoneOrNull())
                            {
                                throw new Exception($"语法错误:无效名称");
                            }
                            value = sb.ToString();
                            if (value == "")
                            {
                                // 空数组,不做处理
                            }
                            else if (value == "null" || value == "Null" || value == "NULL")
                            {
                                // 添加NULL值
                                jup.String(jup.Count, null);
                            }
                            else if (value == "true" || value == "True" || value == "TRUE")
                            {
                                // 添加布尔值
                                jup.Bool(jup.Count, true);
                            }
                            else if (value == "false" || value == "False" || value == "FALSE")
                            {
                                // 添加布尔值
                                jup.Bool(jup.Count, false);
                            }
                            else if (value.IsDouble())
                            {
                                // 添加数值
                                jup.Number(jup.Count, value.ToDouble());
                            }
                            else
                            {
                                throw new Exception($"规则外的\"{chr}\"操作符");
                            }

                            // 清理缓存
                            sb.Clear();
                            name  = null;
                            value = null;
                        }
                        else if (pt == Parse_Done_Value)
                        {
                            // 添加字符串值
                            if (!name.IsNoneOrNull())
                            {
                                throw new Exception($"语法错误:无效名称");
                            }
                            jup.String(jup.Count, value);
                            // 清理缓存
                            sb.Clear();
                            name  = null;
                            value = null;
                        }
                        else if ((pt & Parse_Done) == Parse_Done)
                        {
                            // 完成状态时继续
                        }
                        else
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }

                        // 当前必须要有操作对象
                        if (jup == null)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        // 返回到上层对象
                        jup = jup.Parent;
                        // 解析类型设置为子对象操作完成
                        pt = Parse_Done_Array;
                    }
                    break;

                    #endregion
                case '\\':
                    #region [=====处理转义符=====]
                    if (isString)
                    {
                        // 此字符不支持Unicode
                        if (isUnicode)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        // 当处于字符串模式时,操作转义
                        if (isEscape)
                        {
                            // 当处于转义模式,则直接添加字符并退出转义
                            sb.Append(chr);
                            isEscape = false;
                        }
                        else
                        {
                            // 当未处于转义模式,则进入转义模式
                            isEscape = true;
                        }
                    }
                    else
                    {
                        throw new Exception($"规则外的\"{chr}\"操作符");
                    }
                    break;

                    #endregion
                case '"':
                    #region [=====处理双引号=====]
                    if (isString)
                    {
                        // 此字符不支持Unicode
                        if (isUnicode)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        // 当处于字符串模式时,操作转义
                        if (isEscape)
                        {
                            // 当处于转义模式,则直接添加字符并退出转义
                            sb.Append(chr);
                            isEscape = false;
                        }
                        else
                        {
                            // 当未处于转义模式,则表示字符串结束
                            if (pt == Parse_Name)
                            {
                                // 名称模式,则设置名称
                                name = sb.ToString();
                                sb.Clear();
                                pt = Parse_Done_Name;
                            }
                            else if (pt == Parse_Value)
                            {
                                // 值模式,则设置值
                                value = sb.ToString();
                                sb.Clear();
                                pt = Parse_Done_Value;
                            }
                            else
                            {
                                throw new Exception($"规则外的\"{chr}\"操作符");
                            }
                            // 退出字符串模式
                            isString = false;
                        }
                    }
                    else
                    {
                        // 当未处于字符串模式时,则进入字符串模式
                        if (pt == Parse_Name)
                        {
                            if (!name.IsNoneOrNull())
                            {
                                throw new Exception($"规则外的\"{chr}\"操作符");
                            }
                            isString = true;
                        }
                        else if (pt == Parse_Value)
                        {
                            if (!value.IsNoneOrNull())
                            {
                                throw new Exception($"规则外的\"{chr}\"操作符");
                            }
                            isString = true;
                        }
                        else
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                    }
                    break;

                    #endregion
                case ':':
                    #region [=====处理冒号=====]
                    if (isString)
                    {
                        // 此字符不支持转义及Unicode
                        if (isEscape)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        if (isUnicode)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        // 当处于字符串模式时,直接添加到字符串生成器
                        sb.Append(chr);
                    }
                    else
                    {
                        // 特殊处理,如果当前为名称解析时,完成名称解析
                        if (pt == Parse_Name)
                        {
                            // 当名称模式时,可作为隐藏结束符使用
                            name = sb.ToString();
                            if (name.IsNoneOrNull())
                            {
                                throw new Exception($"语法错误,名称不允许未空");
                            }
                            sb.Clear();
                            // 设置为值模式
                            pt = Parse_Value;
                        }
                        else if (pt == Parse_Done_Name)
                        {
                            // 设置为值模式
                            pt = Parse_Value;
                        }
                        else
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                    }
                    break;

                    #endregion
                case ',':
                    #region [=====处理逗号=====]
                    if (isString)
                    {
                        // 此字符不支持转义及Unicode
                        if (isEscape)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        if (isUnicode)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }
                        // 当处于字符串模式时,直接添加到字符串生成器
                        sb.Append(chr);
                    }
                    else
                    {
                        // 父对象不允许为空
                        if (jup == null)
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }

                        // 特殊处理,如果当前为值解析时,完成数值解析
                        if (pt == Parse_Value || pt == Parse_Done_Value)
                        {
                            // 当为内容时,进行内容添加
                            if (pt == Parse_Value)
                            {
                                // 当为值模式时,可作为隐藏结束符使用
                                value = sb.ToString();

                                if (value == "null" || value == "Null" || value == "NULL")
                                {
                                    // 添加字符串值
                                    if (jup.UnitType == UnitType.Object)
                                    {
                                        jup.String(name, null);
                                    }
                                    else if (jup.UnitType == UnitType.Array)
                                    {
                                        jup.String(jup.Count, null);
                                    }
                                    else
                                    {
                                        throw new Exception($"数据类型\"{jup.UnitType.ToString()}\"不支持设置子元素");
                                    }
                                }
                                else if (value == "true" || value == "True" || value == "TRUE")
                                {
                                    // 添加布尔值
                                    if (jup.UnitType == UnitType.Object)
                                    {
                                        jup.Bool(name, true);
                                    }
                                    else if (jup.UnitType == UnitType.Array)
                                    {
                                        jup.Bool(jup.Count, true);
                                    }
                                    else
                                    {
                                        throw new Exception($"数据类型\"{jup.UnitType.ToString()}\"不支持设置子元素");
                                    }
                                }
                                else if (value == "false" || value == "False" || value == "FALSE")
                                {
                                    // 添加布尔值
                                    if (jup.UnitType == UnitType.Object)
                                    {
                                        jup.Bool(name, false);
                                    }
                                    else if (jup.UnitType == UnitType.Array)
                                    {
                                        jup.Bool(jup.Count, false);
                                    }
                                    else
                                    {
                                        throw new Exception($"数据类型\"{jup.UnitType.ToString()}\"不支持设置子元素");
                                    }
                                }
                                else if (value.IsDouble())
                                {
                                    // 添加数值
                                    double dbl = value.ToDouble();
                                    if (jup.UnitType == UnitType.Object)
                                    {
                                        jup.Number(name, dbl);
                                    }
                                    else if (jup.UnitType == UnitType.Array)
                                    {
                                        jup.Number(jup.Count, dbl);
                                    }
                                    else
                                    {
                                        throw new Exception($"数据类型\"{jup.UnitType.ToString()}\"不支持设置子元素");
                                    }
                                }
                                else
                                {
                                    throw new Exception($"语法错误:字符串必须使用双引号定义");
                                }

                                // 清理缓存
                                sb.Clear();
                                name  = null;
                                value = null;
                            }
                            else
                            {
                                // 添加字符串值
                                if (jup.UnitType == UnitType.Object)
                                {
                                    jup.String(name, value);
                                }
                                else if (jup.UnitType == UnitType.Array)
                                {
                                    jup.String(jup.Count, value);
                                }
                                else
                                {
                                    throw new Exception($"数据类型\"{jup.UnitType.ToString()}\"不支持设置子元素");
                                }

                                // 清理缓存
                                sb.Clear();
                                name  = null;
                                value = null;
                            }
                        }
                        else if (pt == Parse_Done_Object || pt == Parse_Done_Array)
                        {
                            // 当为对象或数组时,则进入下一个对象的操作
                        }
                        else
                        {
                            throw new Exception($"规则外的\"{chr}\"操作符");
                        }

                        // 判断父对象类型
                        if (jup.UnitType == UnitType.Object)
                        {
                            // 当父对象是对象时,设置子对象,进入名称模式
                            pt = Parse_Name;
                        }
                        else if (jup.UnitType == UnitType.Array)
                        {
                            // 当父对象是对象时,进入值模式
                            pt = Parse_Value;
                        }
                        else
                        {
                            throw new Exception($"数据类型\"{jup.UnitType.ToString()}\"不支持设置子元素");
                        }
                    }
                    break;

                    #endregion
                case ' ':
                    #region [=====处理空格=====]
                    if (isString)
                    {
                        // 此字符不支持转义
                        if (isEscape)
                        {
                            throw new Exception($"规则外的\"{chr}\"字符");
                        }
                        // 当处于字符串模式时,直接添加到字符串生成器
                        sb.Append(chr);
                    }
                    else
                    {
                        if (pt == Parse_Name)
                        {
                            // 判断是否为多余的空格
                            if (sb.Length <= 0)
                            {
                                break;
                            }
                            // 当名称模式时,可作为隐藏结束符使用
                            name = sb.ToString();
                            sb.Clear();
                            pt = Parse_Done_Name;
                        }
                        else if (pt == Parse_Value)
                        {
                            // 判断是否为多余的空格
                            if (sb.Length <= 0)
                            {
                                break;
                            }
                            // 当名称模式时,可作为隐藏结束符使用
                            value = sb.ToString();

                            if (value == "null" || value == "Null" || value == "NULL")
                            {
                                // 添加字符串值
                                if (jup.UnitType == UnitType.Object)
                                {
                                    if (name.IsNoneOrNull())
                                    {
                                        throw new Exception($"语法错误:名称不允许未空");
                                    }
                                    jup.String(name, null);
                                }
                                else if (jup.UnitType == UnitType.Array)
                                {
                                    if (!name.IsNoneOrNull())
                                    {
                                        throw new Exception($"语法错误:无效名称");
                                    }
                                    jup.String(jup.Count, null);
                                }
                                else
                                {
                                    throw new Exception($"数据类型\"{jup.UnitType.ToString()}\"不支持设置子元素");
                                }
                            }
                            else if (value == "true" || value == "True" || value == "TRUE")
                            {
                                // 添加布尔值
                                if (jup.UnitType == UnitType.Object)
                                {
                                    jup.Bool(name, true);
                                }
                                else if (jup.UnitType == UnitType.Array)
                                {
                                    jup.Bool(jup.Count, true);
                                }
                                else
                                {
                                    throw new Exception($"数据类型\"{jup.UnitType.ToString()}\"不支持设置子元素");
                                }
                            }
                            else if (value == "false" || value == "False" || value == "FALSE")
                            {
                                // 添加布尔值
                                if (jup.UnitType == UnitType.Object)
                                {
                                    jup.Bool(name, false);
                                }
                                else if (jup.UnitType == UnitType.Array)
                                {
                                    jup.Bool(jup.Count, false);
                                }
                                else
                                {
                                    throw new Exception($"数据类型\"{jup.UnitType.ToString()}\"不支持设置子元素");
                                }
                            }
                            else if (value.IsDouble())
                            {
                                // 添加数值
                                double dbl = value.ToDouble();
                                if (jup.UnitType == UnitType.Object)
                                {
                                    if (name.IsNoneOrNull())
                                    {
                                        throw new Exception($"语法错误:名称不允许未空");
                                    }
                                    jup.Number(name, dbl);
                                }
                                else if (jup.UnitType == UnitType.Array)
                                {
                                    if (!name.IsNoneOrNull())
                                    {
                                        throw new Exception($"语法错误:无效名称");
                                    }
                                    jup.Number(jup.Count, dbl);
                                }
                                else
                                {
                                    throw new Exception($"数据类型\"{jup.UnitType.ToString()}\"不支持设置子元素");
                                }
                            }
                            else
                            {
                                throw new Exception($"语法错误:字符串必须使用双引号定义");
                            }
                            sb.Clear();
                            pt = Parse_Done_Value;
                        }
                    }
                    break;

                    #endregion
                case '\r': break;    //忽略回车符

                case '\n':
                    #region [=====处理换行=====]
                    if (isString)
                    {
                        // 不支持字符串中换行
                        throw new Exception($"规则外的换行符");
                    }
                    line++;
                    col = 0;
                    break;

                    #endregion
                case 'u':
                    #region [=====处理u字符=====]
                    if (isString)
                    {
                        // 不支持的转义字符
                        if (isUnicode)
                        {
                            throw new Exception($"规则外的\"{chr}\"字符");
                        }
                        // 字符串中处理
                        if (isEscape)
                        {
                            // 当为转义时,进入unicode模式
                            isUnicode = true;
                            isEscape  = false;
                        }
                        else
                        {
                            // 将字符添加到字符串生成器
                            sb.Append(chr);
                        }
                    }
                    else
                    {
                        // 将字符添加到字符串生成器
                        sb.Append(chr);
                    }
                    break;

                    #endregion
                case 'n':
                    #region [=====处理n字符=====]
                    if (isString)
                    {
                        // 不支持的转义字符
                        if (isUnicode)
                        {
                            throw new Exception($"规则外的\"{chr}\"字符");
                        }
                        // 字符串中处理
                        if (isEscape)
                        {
                            // 当为转义时,添加换行符
                            sb.Append('\n');
                            isEscape = false;
                        }
                        else
                        {
                            // 将字符添加到字符串生成器
                            sb.Append(chr);
                        }
                    }
                    else
                    {
                        // 将字符添加到字符串生成器
                        sb.Append(chr);
                    }
                    break;

                    #endregion
                case 'r':
                    #region [=====处理r字符=====]
                    if (isString)
                    {
                        // 不支持的转义字符
                        if (isUnicode)
                        {
                            throw new Exception($"规则外的\"{chr}\"字符");
                        }
                        // 字符串中处理
                        if (isEscape)
                        {
                            // 当为转义时,添加回车符
                            sb.Append('\r');
                        }
                        else
                        {
                            // 将字符添加到字符串生成器
                            sb.Append(chr);
                            isEscape = false;
                        }
                    }
                    else
                    {
                        // 将字符添加到字符串生成器
                        sb.Append(chr);
                    }
                    break;

                    #endregion
                case '/':
                    #region [=====处理r字符=====]
                    if (isString)
                    {
                        // 不支持的转义字符
                        if (isUnicode)
                        {
                            throw new Exception($"规则外的\"{chr}\"字符");
                        }
                        // 字符串中处理
                        if (isEscape)
                        {
                            // 当为转义时,添加回车符
                            sb.Append(chr);
                            isEscape = false;
                        }
                        else
                        {
                            // 将字符添加到字符串生成器
                            sb.Append(chr);
                        }
                    }
                    else
                    {
                        // 将字符添加到字符串生成器
                        sb.Append(chr);
                    }
                    break;

                    #endregion
                default:
                    if (isString)
                    {
                        // 字符串处理
                        if (isEscape)
                        {
                            switch (chr)
                            {
                            case 'n': sb.Append('\n'); break;

                            case 'r': sb.Append('\r'); break;

                            case '/': sb.Append('/'); break;

                            case 'b': sb.Append('\b'); break;

                            case 'f': sb.Append('\f'); break;

                            case 't': sb.Append('\t'); break;

                            default: throw new Exception($"规则外的\"{chr}\"字符");
                            }
                            isEscape = false;
                        }
                        else if (isUnicode)
                        {
                            uLen++;
                            uCode += int.Parse(chr.ToString(), System.Globalization.NumberStyles.HexNumber) * (int)Math.Pow(16, 4 - uLen);
                            if (uLen == 4)
                            {
                                char uc = (char)uCode;
                                // 将字符添加到字符串生成器
                                sb.Append(uc);
                                isUnicode = false;
                                uLen      = 0;
                                uCode     = 0;
                            }
                        }
                        else
                        {
                            // 将字符添加到字符串生成器
                            sb.Append(chr);
                        }
                    }
                    else
                    {
                        // 所有完成状态之后不允许尾随字符
                        if ((pt & Parse_Done) == Parse_Done)
                        {
                            throw new Exception($"规则外的\"{chr}\"字符");
                        }

                        // 将字符添加到字符串生成器
                        sb.Append(chr);
                    }
                    break;
                }
            }

            //} catch (Exception ex) {
            //    throw new Exception($"行 {line} 字符 {col} 解析发生异常", ex);
            //}

            if (jup != null)
            {
                throw new Exception($"语法错误:Json代码不完整");
            }

            return(res);
        }