/// <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 + "\"字符"); } }
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); } } }
public JsonParser(JsonObject obj) { gObj = obj; nLine = 0; nIndex = 0; }
/// <summary> /// 返回父对象 /// </summary> private void BackToParent() { if (dp.ID == gObj.ID) { //throw new Exception("多余的关键字!"); dp = null; } else { dp = dp.Parent; } }
/// <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("非法字符!"); } }