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; }
int Cjson::size(){ //先获得最原始的Cjson地址 Cjson *TypeValueTemp = pJson->vecCjson.at(0); int i = -1; while(i++ != pJson->vecField.size() - 1){ //如果用户输入错误则直接返回-1 if(pJson->vecField.at(i).field == "" && pJson->vecField.at(i).num == -1) return -1; //如果是字段 if(pJson->vecField.at(i).field != "" && TypeValueTemp->type == "class CjsonA"){ //如果有这个字段再返回 auto it = ((CjsonA*)TypeValueTemp->pClass)->mapdata.begin(); for(;it != ((CjsonA*)TypeValueTemp->pClass)->mapdata.end();it++){ if(it->first.c_str() == pJson->vecField.at(i).field){ //pJson值在[]重载时已经带下去了 TypeValueTemp = &((CjsonA*)TypeValueTemp->pClass)->mapdata[(pJson->vecField.at(i).field)]; goto rem; } } //如果循环自然退出则表示没找到返回-1 return -1; rem:; } else if(pJson->vecField.at(i).num != -1 && TypeValueTemp->type == "class CszValue"){ //如果数组中有这么长再返回 if(((CszValue*)TypeValueTemp->pClass)->vecszValue.size() > (unsigned int)pJson->vecField.at(i).num){ //pJson已经在[]重载时带下去了 TypeValueTemp = &((CszValue*)TypeValueTemp->pClass)->vecszValue.at(pJson->vecField.at(i).num); } else return -1; } else return -1; } if(type == "class CjsonA") return TypeValueTemp->toJson().size(); else if(type == "class CszValue") return TypeValueTemp->tosz().size(); else return -1; }
Cjson* Cjson::TypeEqual(string strTemp){ //把传进来的field循环查看,如果有则修改,无则创建 int level = -1; Cjson* pTypeValueReturn = pJson->vecCjson.at(0); Cjson* pTypeValueTemp = pJson->vecCjson.at(0); int i = -1; while(i++ != pTypeValueReturn->pJson->vecField.size() - 1){ //表示当前层数 level++; //如果field是空并且数字小于0说明用户填错 if(pTypeValueReturn->pJson->vecField.at(i).field == "" && pTypeValueReturn->pJson->vecField.at(i).num < 0){ //跳到结尾 goto rem; } //如果field不是空说明此处是字段 if(pTypeValueReturn->pJson->vecField.at(i).field != ""){ //如果当前层是最后一层则说明现在应该创建或覆盖字段 if(i == pTypeValueReturn->pJson->vecField.size() - 1){ //如果发现是"\"delete\""则把当前字段删除 if(strTemp == "\"delete\""){ auto it = pTypeValueTemp->toJson().mapdata.begin(); for(;it!=pTypeValueTemp->toJson().mapdata.end();it++){ if(it->first.c_str() == pTypeValueReturn->pJson->vecField.at(i).field){ //在释放之后pJson值会丢失,因为释放的是本层Cjson,所以pJson会被重置,所以先取出来 //CjsonA *pJsonTemp = pJson; pTypeValueTemp->toJson().mapdata.erase(it); goto rem; //这里使用pJsonTemp来清空 //pJsonTemp->vecField.clear(); //pJsonTemp->vecCjson.clear(); //return pTypeValueReturn; } } } else{ //因为当不是最后一层的时候,只可能通过json的map找到一个数组或json传进来 //如果找到了一个数组但是用户指定当前层为字段的话说明用户要把数组改为json,应该先到上一层创建一个json,然后再获得创建层map进行赋值 if(pTypeValueTemp->type == "class CszValue"){ //重新给上一层赋值新的json,以便下面使用 pTypeValueReturn->pJson->vecCjson.at(level - 1)->toJson().mapdata[(pTypeValueReturn->pJson->vecField.at(i - 1).field)] = CjsonA(); pTypeValueTemp = &(pTypeValueReturn->pJson->vecCjson.at(level - 1)->toJson().mapdata[(pTypeValueReturn->pJson->vecField.at(i - 1).field)]); } //退回上一层添加或覆盖字段 pTypeValueTemp->toJson().mapdata[(pTypeValueReturn->pJson->vecField.at(i).field)] = (Cjson)(CstrValue)strTemp; } break; } //如果当前层根本不是json说明用户改变了当前层的性质,且不会是最后一层,因为如果是则在上面跳出循环了 if(pTypeValueTemp->type != "class CjsonA"){ //如果下一层是field说明需要创建一个json,以便下面使用 if(pTypeValueReturn->pJson->vecField.at(i + 1).field != ""){ //重新给上一层赋值新的json,以便下面使用 pTypeValueReturn->pJson->vecCjson.at(level - 1)->toJson().mapdata[(pTypeValueReturn->pJson->vecField.at(i - 1).field)] = CjsonA(); } //如果下一层是数字说明需要创建一个数组,以便下面使用 else{ pTypeValueReturn->pJson->vecCjson.at(level - 1)->toJson().mapdata[(pTypeValueReturn->pJson->vecField.at(i - 1).field)] = CszValue(); } } //如果当前层能找到 auto it = pTypeValueTemp->toJson().mapdata.begin(); for(;it != pTypeValueTemp->toJson().mapdata.end();it++){ //如果能找到,直接跳出,因为只是取下一层指针所以此处不需要操作 if(it->first.c_str() == pTypeValueReturn->pJson->vecField.at(i).field) break; } if(it == pTypeValueTemp->toJson().mapdata.end()){ //如果下一层是field说明需要创建一个json if(pTypeValueReturn->pJson->vecField.at(i + 1).field != ""){ pTypeValueTemp->toJson().mapdata[(pTypeValueReturn->pJson->vecField.at(i).field)] = CjsonA(); } //如果下一层是数字说明需要创建一个数组 else{ pTypeValueTemp->toJson().mapdata[(pTypeValueReturn->pJson->vecField.at(i).field)] = CszValue(); } } //把找到的下一层Cjson传给指针 pTypeValueTemp = &(pTypeValueTemp->toJson().mapdata[(pTypeValueReturn->pJson->vecField.at(i).field)]); } //否则是数字 else{ //如果当前层数组根本不存在则先创建数组 if(pTypeValueTemp->type != "class CszValue"){ //map在改数据的时候会先执行这个类的析构,所以不用管节点内存泄漏 //重新给上一层赋值新的空数组,以便下面使用 pTypeValueReturn->pJson->vecCjson.at(level - 1)->toJson().mapdata[(pTypeValueReturn->pJson->vecField.at(i - 1).field)] = CszValue(); } //如果vec中的数字比数组实际大小大则追加在末尾 if(pTypeValueReturn->pJson->vecField.at(i).num >= (int)pTypeValueTemp->tosz().vecszValue.size()){ //如果本层是最后一层则追加一个字段 if(i == pTypeValueReturn->pJson->vecField.size() - 1){ //如果是"\"delete\"" if(strTemp == "\"delete\""){ if(pTypeValueTemp->tosz().vecszValue.size() >= 1) pTypeValueTemp->tosz().vecszValue.pop_back(); } //如果是"\"insert\"" else if(strTemp == "\"insert\""){ //这里不会有影响,因为当填入数值过大时就不会取到这一层,上一层还是有pJson值的 pTypeValueTemp->tosz().vecszValue.push_back(CstrValue(strTemp)); } else{ pTypeValueTemp->tosz().vecszValue.push_back(CstrValue(strTemp)); } break; } //如果下一层是field则追加一个json else if(pTypeValueReturn->pJson->vecField.at(i + 1).field != ""){ pTypeValueTemp->tosz().vecszValue.push_back(CjsonA()); } //如果下一层是数字说明用户填错,因为数组中是不可以直接添加数组的 else{ goto rem; } //写size - 1的原因是当用户输入的数字过大时也采用最后一个 pTypeValueTemp = &(pTypeValueTemp->tosz().vecszValue.at(pTypeValueTemp->tosz().vecszValue.size() - 1)); } //如果有则覆盖 else{ //如果本层是最后一层则覆盖字段 if(i == pTypeValueReturn->pJson->vecField.size() - 1){ //如果是"\"delete\"" if(strTemp == "\"delete\""){ pTypeValueTemp->tosz().vecszValue.erase(pTypeValueTemp->tosz().vecszValue.begin() + pTypeValueReturn->pJson->vecField.at(i).num); } //如果是"\"insert\"" else if(strTemp == "\"insert\""){ //因为insert出来的东西正是本层所指的CTypeValue,所以会导致pJson为空 //CjsonA* pJsonTemp = pJson; Cjson temp = CstrValue(strTemp); auto num = pTypeValueTemp->tosz().vecszValue.begin() + pTypeValueReturn->pJson->vecField.at(i).num; pTypeValueTemp->tosz().vecszValue.insert(num,temp); //pJson = pJsonTemp; } else{ Cjson temp = (CstrValue(strTemp)); int num = pTypeValueReturn->pJson->vecField.at(i).num; pTypeValueTemp->tosz().vecszValue.at(num) = temp; } break; } //如果下一层是field则覆盖一个空json else if(pTypeValueReturn->pJson->vecField.at(i + 1).field != ""){ pTypeValueTemp->tosz().vecszValue.at(pTypeValueReturn->pJson->vecField.at(i).num) = CjsonA(); } //如果下一层是数字说明用户填错,因为数组中是不可以直接添加数组的 else{ goto rem; } //给下一层指针 pTypeValueTemp = &(pTypeValueTemp->tosz().vecszValue.at(pTypeValueReturn->pJson->vecField.at(i).num)); } } } rem: //使用过一次就清空 pTypeValueReturn->pJson->vecField.clear(); pTypeValueReturn->pJson->vecCjson.clear(); return pTypeValueReturn; }