Ejemplo n.º 1
0
void CjsonA::GetOneJson(string *strJson,string* strOneJson){
	int nLeft = CStringManager::Find(*strJson,'{');
	if(nLeft == -1) mapError[*strJson] = "找不到{";
	else{
		string strTemp = CStringManager::Mid(*strJson,0, nLeft);
		CStringManager::Replace(strTemp,"\t", "");
		CStringManager::Replace(strTemp,"\r\n", "");
		CStringManager::Replace(strTemp,"\n", "");
		CStringManager::Replace(strTemp," ", "");
		if(strTemp != "") mapError[*strJson] = "json前有多余字符";
	}
	CStringManager manager = *strJson;
	int nRight = manager.FindOther('{','}',nLeft);
	if(nRight == -1) mapError[*strJson] = "{}不匹配";
	else{
		string strJsonNext = CStringManager::Mid(*strJson, nRight + 1, CStringManager::GetLength(*strJson) - nRight - 1);
		CStringManager::Replace(strJsonNext,"\t", "");
		CStringManager::Replace(strJsonNext,"\r\n", "");
		CStringManager::Replace(strJsonNext,"\n", "");
		CStringManager::Replace(strJsonNext," ", "");
		if(strJsonNext != "") mapError[*strJson] = "json后有多余字符";
	}
	*strOneJson = CStringManager::Mid(*strJson,nLeft, nRight - nLeft + 1);
	*strJson = CStringManager::Mid(*strJson, nRight + 1, CStringManager::GetLength(*strJson) - nRight);
}
Ejemplo n.º 2
0
FunName::FunName(void **TempFunAddr,const char szTempFun[]){
	this->TempFunAddr = TempFunAddr;
	this->strTempFun = szTempFun;

	CStringManager str = strTempFun;
	str.ReplaceEvery("(","");
	str.ReplaceEvery(")","");
	str.ReplaceEvery(" ","");
	this->strTempFun = str.strInside;
	//strTempFun.Replace("(","");
	//strTempFun.Replace(")","");
	//strTempFun.Replace(" ","");
};
Ejemplo n.º 3
0
CszValue::CszValue(string strValue){
	int num = 0;
	int begin = 0;
	int i = -1;
	while(1){
		i++;
		//如果到了末尾先取出最后一个再退出
		if(strValue[i] == 0){
			//由于在数组中只会出现json和值,出现json时,在下面的循环中遇到0退出,所以这里只要处理遇到逗号的情况
			string strTemp = CStringManager::Mid(strValue,begin,i - begin);
			string strEmpty = strTemp;
			CStringManager::Replace(strEmpty,"\t", "");
			CStringManager::Replace(strEmpty,"\r\n", "");
			CStringManager::Replace(strEmpty,"\n", "");
			CStringManager::Replace(strEmpty," ", "");
			//说明是空数组
			if(strEmpty == "") break;
			//如果不是空数组则开始传入CstrValue分析
			CstrValue strValueTemp = strTemp;
			if(strValueTemp.type == -1){
				mapszError[strTemp] = "不可识别的数组值";
			}
			vecszValue.push_back(strValueTemp);
			break;
		}
		//如果先找到了逗号说明遇到了一个字段值
		if(strValue[i] == ','){
			CstrValue strValueTemp = CStringManager::Mid(strValue,begin, i - begin);
			if(strValueTemp.type == -1){
				mapszError[CStringManager::Mid(strValue,begin, i - begin)] = "不可识别的数组值";
			}
			vecszValue.push_back(strValueTemp);
			num++;
			//取逗号后的位置作为开始,因为i会在循环开始做++,所以不需要动
			begin = i + 1;
		}
		//如果找到了一个{说明找到了一个json
		if(strValue[i] == '{'){
			string strValueTemp = CStringManager::Mid(strValue,0, i);
			int nPre = CStringManager::ReserveFind(strValueTemp,',');
			strValueTemp = CStringManager::Mid(strValueTemp,nPre + 1, i - nPre - 1);
			CStringManager::Replace(strValueTemp,"\t", "");
			CStringManager::Replace(strValueTemp,"\r\n", "");
			CStringManager::Replace(strValueTemp,"\n", "");
			CStringManager::Replace(strValueTemp," ", "");
			if (strValueTemp != "") mapszError[CStringManager::Mid(strValue,nPre + 1, i - nPre - 1)] = "在数组中json元素前有多余字符";

			CStringManager manager = strValue;
			int nRight = manager.FindOther('{','}',i);
			if(nRight == -1) mapszError[strValue] = "{}不匹配";
			CjsonA json;
			map<string, string> mapJsonError = json.LoadJson(CStringManager::Mid(strValue,i, nRight - i + 1));

			if(mapJsonError.size() != 0){
				auto it = mapJsonError.begin();
				for(;it != mapJsonError.end();it++){
					mapszError[it->first] = it->second;
				}
			}

			vecszValue.push_back(json);
			num++;
			//取逗号后的位置作为开始
			while(1){
				//防止在结束时,因为没找到逗号导致i还是原来左括号的位置,先把i放到右括号的位置,循环开始的时候会做++,寻找下一位
				i = nRight;
				nRight++;
				if(strValue[nRight] == 0) return;
				if(strValue[nRight] == '\t' || (strValue[nRight] == '\r' && strValue[nRight + 1] == '\n') || strValue[nRight] == '\n' || strValue[nRight] == ' ') continue;
				else if(strValue[nRight] == ','){
					begin = nRight + 1;
					//i现在取逗号的位置,循环开始的时候会先做++
					i = nRight;
					break;
				}
				else mapszError[strValue] = "数组中的json后有多余字符";
			}
		}
	}
}
Ejemplo n.º 4
0
BOOL CjsonA::GetOneModule(string* strJson,BOOL* flag,string* strName,string *strValue){
	int nNameLeft = CStringManager::Find(*strJson,'{');
	nNameLeft++;
	int nNameRight = nNameLeft;
	//第一次找到的是字段名左侧引号位置
	nNameRight = CStringManager::Find(*strJson,'\"', nNameRight);
	if(nNameRight >= 0){
		name:
		//第二次找到的是右侧引号
		nNameRight = CStringManager::Find(*strJson,'\"', nNameRight);
		if((*strJson)[nNameRight - 1] == '\\') goto name;
	}
	//这时nNameRight的位置是引号
	//寻找双引号之后的冒号
	int nColon = CStringManager::Find(*strJson,':', nNameRight + 1);
	//如果无字段名无冒号则有可能全部是无效字符是一个空json,应该返回0
	if(nNameRight < 0 && nColon < 0){
		string strJsonTemp = *strJson;
		CStringManager::Replace(strJsonTemp,"\t", "");
		CStringManager::Replace(strJsonTemp,"\r\n", "");
		CStringManager::Replace(strJsonTemp,"\n", "");
		CStringManager::Replace(strJsonTemp," ", "");
		if(strJsonTemp != "{}") mapError[*strJson] = "不可识别的部分字符串";
		return 0;
	}
	//如果找不到右侧引号但有冒号
	if(nNameRight == -1 && nColon >= 0){
		mapError[*strJson] = "字段值只有左侧有引号";
		return 0;
	}
	//如果找不到
	if(nColon == -1 && nNameRight >= 0){
		mapError[*strJson] = "有字段名但无冒号";
		return 0;
	}
	//把字段取出
	CstrValue strNameValue = CStringManager::Mid(*strJson,nNameLeft,nColon - nNameLeft);
	if(strNameValue.type == 1) *strName = strNameValue.strValue;
	else{
		*strName = strNameValue.strValue;
		mapError[CStringManager::Mid(*strJson,nNameLeft, nColon - nNameLeft)] = "不可识别的字段名";
	}

	int temp = nColon;
	while(1){
		temp++;
		//如果第一个发现引号说明找到了一个字段
		if((*strJson)[temp] == '\"'){
			*flag = 1;
			rem:
			temp = CStringManager::Find(*strJson,"\"", temp + 1);
			//如果找不到引号,说明出错并且一定到了最后
			if(temp == -1){
				mapError[*strJson] = "无右侧引号";
				return 0;
			}
			if((*strJson)[temp - 1] == '\\') goto rem;
			//这时temp的值时右侧引号的位置,从这里到逗号必须都是无效字符
			*strValue = CStringManager::Mid(*strJson,nColon + 1, temp - nColon);
			while(1){
				temp++;
				if((*strJson)[temp] == '\t' || ((*strJson)[temp] == '\r' && (*strJson)[temp + 1] == '\n') || (*strJson)[temp] == '\n' || (*strJson)[temp] == ' ') continue;
				else if((*strJson)[temp] == ','){
					CStringManager::Delete(*strJson,nNameLeft, temp - nNameLeft + 1);
					return 1;
				}
				//说明到了结尾
				else if((*strJson)[temp] == '}'){
					CStringManager::Delete(*strJson,nNameLeft, temp - nNameLeft);
					return 1;
				}
				else if((*strJson)[temp] == 0){
					mapError[*strJson] = "字段值后无大括号";
					return 0;
				}
				else mapError[*strJson] = "字符串字段值后有多余字符";
			}
		}
		//如果第一个发现逗号说明这个找到的是一个字段
		if((*strJson)[temp] == ','){
			*strValue = CStringManager::Mid(*strJson,nColon + 1, temp - nColon - 1);
			//删掉找到的部分,包括逗号
			CStringManager::Delete(*strJson,nNameLeft, temp - nNameLeft + 1);
			//找到字段则标志设为1
			*flag = 1;
			break;
		}
		//如果第一个发现[说明找到了一个数组,取到strValue里不包括[],删除时带着]删除
		if((*strJson)[temp] == '['){
			//如果找到了一个数组,那么冒号和[之前必须都是无效字符
			string strTemp = CStringManager::Mid(*strJson,nColon + 1,temp - nColon - 1);
			CStringManager::Replace(strTemp,"\t", "");
			CStringManager::Replace(strTemp,"\r\n", "");
			CStringManager::Replace(strTemp,"\n", "");
			CStringManager::Replace(strTemp," ", "");
			if(strTemp != "") mapError[CStringManager::Mid(*strJson,nColon + 1,temp - nColon - 1)] = "冒号和数组间有多余字符";

			CStringManager manager = *strJson;
			int nszRight = manager.FindOther('[',']',temp);
			if(nszRight == -1) mapError[*strJson] = "[]不匹配";
			*strValue = CStringManager::Mid(*strJson,temp + 1, nszRight - temp - 1);
			//先找到后面的逗号然后再删,如果遇到}说明模块结束了则取}之前的位置
			while(1){
				nszRight++;
				if((*strJson)[nszRight] == '\t' || ((*strJson)[nszRight] == '\r' && (*strJson)[nszRight + 1] == '\n') || (*strJson)[nszRight] == '\n' || (*strJson)[nszRight] == ' ') continue;
				else if((*strJson)[nszRight] == '}'){
					nszRight--;
					break;
				}
				else if((*strJson)[nszRight] == ',') break;
				else mapError[*strJson] = "数组后有多余字符";
			}
			CStringManager::Delete(*strJson,nNameLeft, nszRight - nNameLeft + 1);
			
			//找到数组标志设为2
			*flag = 2;
			break;
		}
		//如果找到了大括号右侧说明只有一个字段
		if((*strJson)[temp] == '}'){
			*strValue = CStringManager::Mid(*strJson,nColon + 1, temp - nColon - 1);
			//删掉找到的部分,不包括大括号
			CStringManager::Delete(*strJson,nNameLeft, temp - nNameLeft);
			//找到字段标志设为1
			*flag = 1;
			break;
		}
		//如果找到了一个大括号左侧说明遇到了一个json,取出包括大括号
		if((*strJson)[temp] == '{'){
			//如果找到了一个数组,那么冒号和[之前必须都是无效字符
			string strTemp = CStringManager::Mid(*strJson,nColon + 1, temp - nColon - 1);
			CStringManager::Replace(strTemp,"\t", "");
			CStringManager::Replace(strTemp,"\r\n", "");
			CStringManager::Replace(strTemp,"\n", "");
			CStringManager::Replace(strTemp," ", "");
			if (strTemp != "") mapError[CStringManager::Mid(*strJson,nColon + 1, temp - nColon - 1)] = "冒号和json间有多余字符";

			CStringManager manager = *strJson;
			int nszRight = manager.FindOther('{','}',temp);
			if(nszRight == -1) mapError[*strJson] = "{}不匹配";
			*strValue = CStringManager::Mid(*strJson,temp, nszRight - temp + 1);
			//先找到后面的逗号然后再删,如果遇到}说明模块结束了则取}之前的位置
			while(1){
				nszRight++;
				if((*strJson)[nszRight] == '\t' || ((*strJson)[nszRight] == '\r' && (*strJson)[nszRight + 1] == '\n') || (*strJson)[nszRight] == '\n' || (*strJson)[nszRight] == ' ') continue;
				else if((*strJson)[nszRight] == '}'){
					nszRight--;
					break;
				}
				else if((*strJson)[nszRight] == ',') break;
				else mapError[*strJson] = "json后有多余字符";
			}
			CStringManager::Delete(*strJson,nNameLeft, nszRight - nNameLeft + 1);
			//找到json标志设为3
			*flag = 3;
			break;
		}
	}
	return 1;
}