Beispiel #1
0
 /// <summary>
 /// 处理左大括号
 /// </summary>
 /// <param name="chr"></param>
 private void ResolveLeftBigParantheses(char chr) {
     switch (csNow) {
         case CharStatus.None:
             if (szName == "") {
                 if (dp == null) {
                     dp = gObj;
                     ((JsonObject)dp).IsObject = true;
                     dp.Children.Clear();
                 } else {
                     throw new Exception("非法字符");
                 }
             } else {
                 dp = dp[GetNormalName(szName)];
                 ((JsonObject)dp).IsObject = true;
             }
             csNow = CharStatus.ObjectName;
             break;
         case CharStatus.ObjectValue:
             if (szValue.StartsWith("\"")) {
                 szValue += chr;
             } else {
                 dp = NewChild();
                 ((JsonObject)dp).IsObject = true;
                 csNow = CharStatus.ObjectName;
             }
             break;
         case CharStatus.ObjectName:
             if (dp.IsArray) {
                 dp = NewChild();
                 ((JsonObject)dp).IsObject = true;
                 csNow = CharStatus.ObjectName;
             } else {
                 throw new Exception("意外的\"" + chr + "\"字符");
             }
             break;
         default:
             throw new Exception("意外的\"" + chr + "\"字符");
     }
 }
Beispiel #2
0
        public void Resolve(string json) {
            dp = null;
            csNow = CharStatus.None;

            nLine = 1;
            nIndex = 0;

            for (int i = 0; i < json.Length; i++) {

                nIndex++;
                char chr = json[i];

                try {
                    switch (chr) {
                        case '{'://左大括号
                            ResolveLeftBigParantheses(chr);
                            break;
                        case '}'://右大括号
                            ResolveRightBigParantheses(chr);
                            break;
                        case '\\':
                            #region [=====斜杠=====]
                            switch (csNow) {
                                case CharStatus.ObjectValue:
                                    if (szValue.StartsWith("\"")) {
                                        csNow = CharStatus.SlashValue;
                                    } else {
                                        throw new Exception("非法的数值字符");
                                    }
                                    break;
                                case CharStatus.SlashValue:
                                    szValue += "\\";
                                    break;
                                default:
                                    throw new Exception("规则外的字符!");
                            }
                            break;
                        #endregion
                        case ':':
                            #region [=====冒号=====]
                            switch (csNow) {
                                case CharStatus.None:
                                    if (szName != "") {
                                        csNow = CharStatus.ObjectValue;
                                    } else { throw new Exception("规则外的字符!"); }
                                    break;
                                case CharStatus.ObjectName:
                                case CharStatus.ObjectNameFinish:
                                    csNow = CharStatus.ObjectValue;
                                    break;
                                case CharStatus.ObjectValue:
                                    if (szValue.StartsWith("\"")) {
                                        szValue += chr;
                                    } else {
                                        throw new Exception("非法字符!");
                                    }
                                    break;
                                default:
                                    throw new Exception("非法字符!");
                            }
                            break;
                        #endregion
                        case '"':
                            #region [=====双引号=====]
                            switch (csNow) {
                                case CharStatus.ObjectName:
                                    if (szName == "") {
                                        szName += "\"";
                                    } else {
                                        if (szName.StartsWith("\"")) {
                                            szName += "\"";
                                            csNow = CharStatus.ObjectNameFinish;
                                        } else {
                                            throw new Exception("规则外的字符!");
                                        }
                                    }
                                    break;
                                case CharStatus.ObjectValue:
                                    if (szValue == "") {
                                        szValue += "\"";
                                    } else {
                                        if (szValue.StartsWith("\"")) {
                                            szValue += "\"";
                                            //纯值模式下直接保存值
                                            if (dp == null) gObj.Value = GetNormalValue(szValue);
                                            csNow = CharStatus.ObjectValueFinish;
                                        } else {
                                            throw new Exception("规则外的字符!");
                                        }
                                    }
                                    break;
                                case CharStatus.SlashValue:
                                    szValue += "\"";
                                    csNow = CharStatus.ObjectValue;
                                    break;
                                case CharStatus.None:
                                    //纯值模式
                                    szValue += chr;
                                    csNow = CharStatus.ObjectValue;
                                    break;
                                default:
                                    throw new Exception("意外的\"" + chr + "\"字符");
                            }
                            break;
                        #endregion
                        case '\r':
                            break;
                        case '\n':
                            ResolveWrap(chr);
                            break;
                        case ','://逗号
                            ResolveComma(chr);
                            break;
                        case '['://左中括号,数组开始
                            ResolveLeftInParantheses(chr);
                            break;
                        case ']'://右中括号,数组结束
                            ResolveRightInParantheses(chr);
                            break;
                        case ' ':
                            #region [=====空格=====]
                            switch (csNow) {
                                case CharStatus.ObjectName:
                                    if (szName != "") {
                                        if (szName.StartsWith("\"")) {
                                            throw new Exception("名称不能包含空格!");
                                        } else {
                                            csNow = CharStatus.ObjectNameFinish;
                                        }
                                    }
                                    break;
                                case CharStatus.ObjectValue:
                                    if (szValue != "") {
                                        if (szValue.StartsWith("\"")) {
                                            szValue += chr;
                                        } else {
                                            csNow = CharStatus.ObjectValueFinish;
                                        }
                                    }
                                    break;
                            }
                            break;
                        #endregion
                        default:
                            switch (csNow) {
                                case CharStatus.ObjectName:
                                    szName += chr;
                                    break;
                                case CharStatus.ObjectValue:
                                    szValue += chr;
                                    break;
                                default:
                                    throw new Exception("规则外的字符!");
                            }
                            break;
                    }
                } catch (Exception ex) {
                    throw new Exception("行 " + nLine + " 位置 " + nIndex + " 字符 \"" + chr + "\"(0x" + ((byte)chr).ToString("X2") + ")," + ex.Message);
                }
            }
        }
Beispiel #3
0
 public JsonParser(JsonObject obj) {
     gObj = obj;
     nLine = 0;
     nIndex = 0;
 }
Beispiel #4
0
 /// <summary>
 /// 返回父对象
 /// </summary>
 private void BackToParent() {
     if (dp.ID == gObj.ID) {
         //throw new Exception("多余的关键字!");
         dp = null;
     } else {
         dp = dp.Parent;
     }
 }
Beispiel #5
0
 /// <summary>
 /// 处理左中括号
 /// </summary>
 /// <param name="chr"></param>
 private void ResolveLeftInParantheses(char chr) {
     switch (csNow) {
         case CharStatus.ObjectValue:
             if (szValue.StartsWith("\"")) {
                 szValue += chr;
             } else {
                 dp = NewChild();
                 dp.IsArray = true;
             }
             break;
         default:
             throw new Exception("非法字符!");
     }
 }