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