private static bool _CheckMapStringParamData(JsonData jsonData, MapStringParamRequiredInfo paramRequiredInfo, out string errorString) { List <string> errorStringList = new List <string>(); if (paramRequiredInfo.MapStringRequiredInfo == null) { if (paramRequiredInfo.ParamRequired == ParamRequired.MustHave) { if (jsonData.Keys.Contains(paramRequiredInfo.ParamName) == false) { errorStringList.Add(string.Format("要求必须存在的参数{0}未声明", paramRequiredInfo.ParamName)); } } else if (paramRequiredInfo.ParamRequired == ParamRequired.NotAllowed) { if (jsonData.Keys.Contains(paramRequiredInfo.ParamName) == true) { errorStringList.Add(string.Format("不允许存在的参数{0}被声明了", paramRequiredInfo.ParamName)); } } } else { if (jsonData.Keys.Contains(paramRequiredInfo.ParamName)) { if (_CheckMapStringData(jsonData[paramRequiredInfo.ParamName], paramRequiredInfo.MapStringRequiredInfo, out errorString) == false) { errorStringList.Add(string.Format("参数{0}下属map未通过检查:{1}", paramRequiredInfo.ParamName, errorString)); } } else { errorStringList.Add(string.Format("规则要求对mapString型参数{0}下属的子元素进行检查,而输入数据中不含此参数", paramRequiredInfo.ParamName)); } } if (errorStringList.Count == 0) { errorString = null; return(true); } else { errorString = Utils.CombineString(errorStringList, ";"); return(false); } }
private void _GetMapElement(MapStringRequiredInfo requiredInfo, MapStringInfo formatDefine, out string errorString) { // 解析key if (_tokenQueue.Count == 0) { errorString = "定义不完整"; return; } MapStringToken keyToken = _tokenQueue.Dequeue(); if (keyToken.TokenType != MapStringTokenType.String) { errorString = string.Concat("map子元素中的key名非法,输入值为", keyToken.DefineString); return; } string key = keyToken.DefineString.Trim(); // 检查该变量名是否定义 if (!formatDefine.ParamInfo.ContainsKey(key)) { errorString = string.Format("mapString定义中不存在名为{0}的key", key); return; } // 检查是否已存在此变量名 MapStringParamInfo paramInfo = formatDefine.ParamInfo[key]; if (requiredInfo.ParamRequiredInfo.ContainsKey(key)) { errorString = string.Format("定义中存在相同的key名({0})", key); return; } // 判断key名后是否为等号 if (_tokenQueue.Count == 0) { errorString = string.Format("定义不完整,map子元素中的key名({0})后缺失等号", key); return; } MapStringToken equalSignToken = _tokenQueue.Dequeue(); if (equalSignToken.TokenType != MapStringTokenType.EqualSign) { errorString = string.Concat("map子元素中的key名({0})后应为等号,而输入值为{1}", key, equalSignToken.DefineString); return; } // 解析value值 if (_tokenQueue.Count == 0) { errorString = string.Format("定义不完整,map子元素中的key名({0})在等号后未声明参数要求,请用1声明为必须存在或用0声明为不允许存在", key); return; } MapStringToken valueToken = _tokenQueue.Dequeue(); if (valueToken.TokenType == MapStringTokenType.Number) { if ("1".Equals(valueToken.DefineString)) { MapStringParamRequiredInfo paramRequiredInfo = new MapStringParamRequiredInfo(); paramRequiredInfo.ParamName = key; paramRequiredInfo.ParamRequired = ParamRequired.MustHave; requiredInfo.ParamRequiredInfo.Add(key, paramRequiredInfo); } else if ("0".Equals(valueToken.DefineString)) { MapStringParamRequiredInfo paramRequiredInfo = new MapStringParamRequiredInfo(); paramRequiredInfo.ParamName = key; paramRequiredInfo.ParamRequired = ParamRequired.NotAllowed; requiredInfo.ParamRequiredInfo.Add(key, paramRequiredInfo); } else { errorString = string.Format("map子元素中的key名({0})对应的参数要求非法,输入值为\"{1}\",请用1或0分别设置该参数为必须含有或不允许含有", keyToken.DefineString); return; } } else if (valueToken.TokenType == MapStringTokenType.StartMap) { if (paramInfo.DataType == DataType.MapString) { MapStringRequiredInfo childRequiredInfo = new MapStringRequiredInfo(); _GetMapElement(childRequiredInfo, formatDefine.ParamInfo[key].MapStringInfo, out errorString); if (errorString != null) { errorString = string.Format("名为{0}的map下属的子元素错误:{1}", key, errorString); return; } MapStringParamRequiredInfo paramRequiredInfo = new MapStringParamRequiredInfo(); paramRequiredInfo.ParamName = key; paramRequiredInfo.ParamRequired = ParamRequired.None; paramRequiredInfo.MapStringRequiredInfo = childRequiredInfo; requiredInfo.ParamRequiredInfo.Add(key, paramRequiredInfo); } else { errorString = string.Format("mapString定义中要求key名({0})对应{1}类型的数据,而输入的检查规则却以mapString型进行设置,请不要对非mapString型使用括号声明", key, paramInfo.DataType); return; } } else { errorString = string.Format("map子元素中的key名({0})对应的参数要求非法,输入值为\"{1}\",请用1或0分别设置该参数为必须含有或不允许含有", keyToken.DefineString); return; } // 解析后面的token if (_tokenQueue.Count == 0) { errorString = string.Format("定义不完整,map下的子元素{0}之后未声明用英文逗号分隔下一个子元素,也没有声明map的结束", key); return; } MapStringToken nextToken = _tokenQueue.Dequeue(); if (nextToken.TokenType == MapStringTokenType.EndMap) { errorString = null; return; } else if (nextToken.TokenType == MapStringTokenType.Comma) { if (_tokenQueue.Count == 0) { errorString = string.Format("定义不完整,map下的子元素{0}之后的英文逗号后未声明下一个元素", key); return; } _GetMapElement(requiredInfo, formatDefine, out errorString); if (errorString != null) { errorString = string.Format("名为{0}的子元素后面的元素声明错误:{1}", key, errorString); return; } } else { errorString = string.Format("map下的子元素{0}之后未声明用英文逗号分隔下一个子元素,也没有声明map的结束,输入值为{1}", key, nextToken.DefineString); return; } }