1、json_object_to_json_string()、json_object_put()函数
json_object *json = NULL;
const char *json_str;
json_str = json_object_to_json_string(json);
json_object_put(json);//清除内存
查看json_object结构可知:json_str字符串的地址指向的是该结构体中printbuf *_pb指向的地址,而该地址正是存储json对象转换后的字符串内存区域地址
struct json_object
{
enum json_type o_type;
json_object_delete_fn *_delete;
json_object_to_json_string_fn *_to_json_string;
int _ref_count;
struct printbuf *_pb;
union data {
json_bool c_boolean;
double c_double;
int64_t c_int64;
struct lh_table *c_object;
struct array_list *c_array;
struct {
char *str;
int len;
} c_string;
} o;
};
调用函数json_object_put()函数清理json结构体的时候,就json_str的内存一并清理了,因为不需要自己再专门清理字符串json_str
struct printbuf {
char *buf;
int bpos; //buf中已经使用的数量
int size; //buf的size
};
2、cJSON_Print、cJSON_Delete
在开源项目cJSON中,cJSON结构体并没有像上述json_object结构体中的printbuf *_pb,因此需要自己释放字符串的内存地址。字符串格式化函数调用后返回的字串内存,需要专门调用free函数释放掉
/* The cJSON structure: */
typedef struct cJSON {
struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
int type; /* The type of the item, as above. */
char *valuestring; /* The item's string, if type==cJSON_String */
int valueint; /* The item's number, if type==cJSON_Number */
double valuedouble; /* The item's number, if type==cJSON_Number */
char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
} cJSON;
cJSON *pJsonRoot = cJSON_CreateObject();
char* strJson = cJSON_Print(pJsonRoot);
if (NULL != pJsonRoot)
{
cJSON_Delete(pJsonRoot);
}
printf(strJson);
free(strJson);