void CjsonA::LoadOneModule(string strName,string strValue,BOOL flag){ //如果找到了一个字段 if(flag == 1){ CstrValue strValueTemp = strValue; if(strValueTemp.type == -1){ mapError[strValue] = "不可识别的字段值"; } mapdata[strName] = (Cjson)strValueTemp; } //如果找到了一个数组 if(flag == 2){ CszValue szValueTemp = strValue; mapdata[strName] = szValueTemp; if(szValueTemp.mapszError.size() != 0){ auto it = szValueTemp.mapszError.begin(); for(;it != szValueTemp.mapszError.end();it++){ mapError[it->first] = it->second; } } } //如果找到了一个json if(flag == 3){ CjsonA jsonTemp; map<string,string> mapJsonError = jsonTemp.LoadJson(strValue); mapdata[strName] = jsonTemp; if(mapJsonError.size() != 0){ auto it = mapJsonError.begin(); for(;it != mapJsonError.end();it++){ mapError[it->first] = it->second; } } } }
string CjsonA::AddTypeValue(string strResult,int *nInsert,BOOL ifFirst,string strField,Cjson TypeValue,string NewLineSign,string FormatSign,int FormatLength){ int length = FormatLength; string strFormatSign = ""; while(length--!=0){ strFormatSign = strFormatSign + FormatSign; } string strOne = strFormatSign + "\"" + strField + "\""; if(TypeValue.type == "class CstrValue"){ CstrValue strValueTemp = TypeValue.toValue(); //字符串 if(strValueTemp.type == 1){ strOne = strOne + " : \"" + strValueTemp.strValue + "\""; } //整数和小数 if(strValueTemp.type == 2 || strValueTemp.type == 3){ strOne = strOne + " : " + strValueTemp.strValue; } } if(TypeValue.type == "class CszValue"){ CszValue szValue = TypeValue.tosz(); string strszValue = ""; int i = -1; while(i++ != szValue.size() - 1){ if(i != 0) strszValue = strszValue + ","; Cjson TypeValueTemp = szValue.vecszValue.at(i); if(TypeValueTemp.type == "class CstrValue"){ CstrValue strValueTemp = TypeValueTemp.toValue(); //字符串 if(strValueTemp.type == 1){ strszValue = strszValue + "\"" + strValueTemp.strValue + "\""; } //整数和小数 if(strValueTemp.type == 2 || strValueTemp.type == 3){ strszValue = strszValue + strValueTemp.strValue; } } if(TypeValueTemp.type == "class CjsonA"){ CjsonA jsonTemp = TypeValueTemp.toJson(); string strResultTemp = jsonTemp.tostring(NewLineSign,FormatSign,FormatLength + 1); strszValue = strszValue + strResultTemp; } } strOne = strOne + " : [" + strszValue + "]";//空数组 } if(TypeValue.type == "class CjsonA"){ CjsonA jsonTemp = TypeValue.toJson(); string strResultTemp = jsonTemp.tostring(NewLineSign,FormatSign,FormatLength + 1); strOne = strOne + " : " + strResultTemp; } if(ifFirst == 1){ strOne = NewLineSign + strOne; } else{ strOne = "," + NewLineSign + strOne; } CStringManager::Insert(strResult,*nInsert,strOne); *nInsert = *nInsert + CStringManager::GetLength(strOne); return strResult; }
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后有多余字符"; } } } }