修复JSON链表BUG

This commit is contained in:
gb 2022-09-28 20:56:17 +08:00
parent 367868edcd
commit 45c733cda7
2 changed files with 24 additions and 11 deletions

View File

@ -96,11 +96,18 @@ namespace gb
node->valuestring = NULL; node->valuestring = NULL;
node->child = NULL; node->child = NULL;
} }
cJSON* json::create_element_with_name(const char* name) cJSON* json::create_element(bool is_array)
{ {
cJSON* obj = cJSON_CreateObject(); cJSON* obj = is_array ? cJSON_CreateArray() : cJSON_CreateObject();
bzero(obj, sizeof(*obj)); bzero(obj, sizeof(*obj));
return obj;
}
cJSON* json::create_element_with_name(const char* name)
{
cJSON* obj = json::create_element();
if(name) if(name)
{ {
obj->string = (char*)malloc(strlen(name) + 4); obj->string = (char*)malloc(strlen(name) + 4);
@ -153,8 +160,13 @@ namespace gb
return now; return now;
now = json::create_element_with_name(path[0].c_str()); now = json::create_element_with_name(path[0].c_str());
if(prev) if (prev)
*prev = now; {
cJSON* pr = (cJSON*)((DWORD_PTR)prev - (DWORD_PTR)&((cJSON*)0)->next);
pr->next = now;
now->prev = pr;
// *prev = now;
}
else else
{ {
obj_->child = now; obj_->child = now;
@ -185,7 +197,7 @@ namespace gb
if(!create) if(!create)
return NULL; return NULL;
obj_ = cJSON_CreateObject(); obj_ = json::create_element();
obj_->child = json::create_element_with_name(tree[0].c_str()); obj_->child = json::create_element_with_name(tree[0].c_str());
} }
@ -221,7 +233,7 @@ namespace gb
{ {
clear(); clear();
obj_ = array ? cJSON_CreateArray() : cJSON_CreateObject(); obj_ = json::create_element(array);
is_array_ = array; is_array_ = array;
return true; return true;
@ -406,7 +418,7 @@ namespace gb
if(is_array_) if(is_array_)
{ {
if(!obj_) if(!obj_)
obj_ = cJSON_CreateArray(); obj_ = json::create_element(true);
cJSON_AddItemToArray(obj_, val ? cJSON_CreateTrue() : cJSON_CreateFalse()); cJSON_AddItemToArray(obj_, val ? cJSON_CreateTrue() : cJSON_CreateFalse());
} }
@ -434,7 +446,7 @@ namespace gb
if(is_array_) if(is_array_)
{ {
if(!obj_) if(!obj_)
obj_ = cJSON_CreateArray(); obj_ = json::create_element(true);
cJSON_AddItemToArray(obj_, cJSON_CreateNumber(val)); cJSON_AddItemToArray(obj_, cJSON_CreateNumber(val));
} }
@ -460,7 +472,7 @@ namespace gb
if(is_array_) if(is_array_)
{ {
if(!obj_) if(!obj_)
obj_ = cJSON_CreateArray(); obj_ = json::create_element(true);
cJSON_AddItemToArray(obj_, cJSON_CreateNumber(val)); cJSON_AddItemToArray(obj_, cJSON_CreateNumber(val));
} }
@ -486,7 +498,7 @@ namespace gb
if(is_array_) if(is_array_)
{ {
if(!obj_) if(!obj_)
obj_ = cJSON_CreateArray(); obj_ = json::create_element(true);
cJSON_AddItemToArray(obj_, cJSON_CreateString(val.c_str())); cJSON_AddItemToArray(obj_, cJSON_CreateString(val.c_str()));
} }
@ -518,7 +530,7 @@ namespace gb
if(is_array_) if(is_array_)
{ {
if(!obj_) if(!obj_)
obj_ = cJSON_CreateArray(); obj_ = json::create_element(true);
if(obj && obj->obj_) if(obj && obj->obj_)
{ {
cJSON_AddItemToArray(obj_, obj->obj_); cJSON_AddItemToArray(obj_, obj->obj_);

View File

@ -29,6 +29,7 @@ namespace gb
static std::string to_string(cJSON* root, bool formatted); static std::string to_string(cJSON* root, bool formatted);
static std::string get_value_as_string(cJSON* root, bool integer = false); static std::string get_value_as_string(cJSON* root, bool integer = false);
static void free_node_data(cJSON* node); static void free_node_data(cJSON* node);
static cJSON* create_element(bool is_array = false);
static cJSON* create_element_with_name(const char* name); static cJSON* create_element_with_name(const char* name);
public: public: