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); }
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后有多余字符"; } } } }
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; }