Cjson_parse () 内存消耗计算
cjson_parse()是cjson中解析字符串中json数据的一个函数,这个函数通过字符串中的数据,产生一个存储json数据的链表,对于嵌入式设备来说,内存非常有限,而这个函数通过不断插入链表的方式占用内存,如果不了解这个函数的内存占用机制,可能在程序的运行过程中出现不可预知的风险,如内存溢出等等。
Cjson_parse()如何解析字符串
cjson顺序解析字符串通过识别"{","[",":",""",来判断json的是数据的结构,遇到每一个json对象都会创建一个cjson结构体,通过结构体的指针可以连接前后的数据。
Cjson_parse() 内存消耗计算
通过cjson解析字符串的原理我们可以知道影响cjson占用内存的因素一个是cjson结构体的多少即创建了多少cjson对象,第二个是每个json对象的数据量,因为cjson存储数据主要是以字符串为主,所以我们可以粗略估计所有对象的数据量之和约等于整个要解析字符串的大小,由此我们可以得到一个计算内存消耗的公式:
消耗内存 = cjson对象数量 * sizeof(cjson)+ 字符串长度
其中sizeof(cjson)= 64 。
typedef struct cJSON {
struct cJSON*next,*prev; /* 遍历数组或对象链的前向或后向链表指针*/
struct cJSON *child; /*数组或对象的孩子节点*/
int type; /* key的类型*/
char *valuestring; /*字符串值*/
int valueint; /* 整数值*/
double valuedouble; /* 浮点数值*/
char *string; /* key的名字*/
} cJSON;
举例
{
"person": {
"firstName": "A",
"lastName": "AAAA",
"email": "666666@qq.com",
"age": 18,
"height": 1.8
}
}
上面这个json结构体字符串长度为92,解析所需要创建的json结构体数量为13个,可计算消耗内存为
13*64+92 = 924 byte 接近1k的内存,可见内存消耗还是比较大的