先了解一下cJSON_Parse(),函数原型如下
网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、微信小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了瀍河免费建站欢迎大家使用!CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
函数作用:将一个符合json数据结构的字符串转换为cJSON结构体。
参数:
value:输入的字符串
返回值:如果解析正常,返回一个指向整个object的指针;如果解析失败,则返回NULL。
注意:cJSON_Parse()函数会在堆区开辟空间,因此使用完后要及时调用cJSON_Delete释放内存,防止内存泄漏问题
上代码
#include#include "cJSON.h"
int main(int argc, char const *argv[])
{
char buf[512] = "111111qqq";
printf("buf:%s\n",buf);
cJSON* cjson = cJSON_Parse(buf);//将JSON字符串转换成JSON结构体
if(cjson == NULL)//判断转换是否成功
{
printf("Error before: [%s]\n", cJSON_GetErrorPtr());
return -1;
}
else
{
printf("cJSON错误%s\n",cJSON_Print(cjson));//打包成功调用cJSON_Print打印输出
}
cJSON_Delete(cjson);
return 0;
}
——————————————————————————————————————————
在进行使用cJSON库解析json字符串时发现,如果只使用if(cjson == NULL)并不能判断以数字开头的字符串,函数返回值会保留字符串的数字部分
此时如果继续去调用函数去反序列化json,由于格式不匹配,便会“段错误”;
目前想到的解决方式如下:
既然cJSON_Parse()函数无法完全判断,那就增加判断条件,我选用的的是使用cJSON_GetObjectItem()函数,判断一下键值对,该函数若查找的键没有对应值则会返回NULL;
json里面,键值对的值是可以为NULL的,因此选择键值对时需要注意;
#include#include "cJSON.h"
int main(int argc, char const *argv[])
{
char buf[512] = "111111qqq";
printf("buf:%s\n",buf);
cJSON* cjson = cJSON_Parse(buf);//将JSON字符串转换成JSON结构体
if(cjson == NULL)//判断转换是否成功
{
printf("Error before: [%s]\n", cJSON_GetErrorPtr());
return -1;
}
else
{
if(cJSON_GetObjectItem(cjson, "uuid") == NULL)
{
printf("Error before: [%s]\n", cJSON_GetErrorPtr());
return -1;
}
printf("cJSON错误%s\n",cJSON_Print(cjson));//打包成功调用cJSON_Print打印输出
}
cJSON_Delete(cjson);
return 0;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧