版本:完整版 V4.0.2
软件包: rt_cjson_tools-latest
现象:
在做项目的过程中 经常出现cjson创建失败的情况。 debug时发现,cJSON_AddNumberToObject创建cjson对象时 经常创建失败。故有此次测试。
测试环境:
main.cpp
int main(void)
{
test();
for (;;)
{
rt_thread_mdelay(1000);
}
return RT_EOK;
}
void test(void)
{
cJSON *xRoot = RT_NULL;
cJSON *xObject = RT_NULL;
char *pJson = RT_NULL;
cJSON *n = RT_NULL;
xRoot = cJSON_CreateObject();
if (NULL == xRoot)
return;
xObject = cJSON_CreateObject();
if (NULL == xObject)
return;
n = cJSON_AddNumberToObject(xRoot, "SHADHALKJF", 100);
LOG_E("is num = %d",cJSON_IsNumber(n));
cJSON_AddStringToObject(xRoot, "Manufacturer", "hello world");
pJson =cJSON_PrintUnformatted(xRoot);
if(pJson == NULL)
{
LOG_W("NULL");
}
// pJson = cJSON_Print(xRoot);
rt_kprintf("%s\n", pJson);
if (pJson)
{
cJSON_free(pJson);
}
if (xRoot)
{
cJSON_Delete(xRoot);
}
}

创建json字符串失败。
于是我屏蔽了cJSON_AddNumberToObject()函数
void test(void)
{
cJSON *xRoot = RT_NULL;
cJSON *xObject = RT_NULL;
char *pJson = RT_NULL;
cJSON *n = RT_NULL;
xRoot = cJSON_CreateObject();
if (NULL == xRoot)
return;
xObject = cJSON_CreateObject();
if (NULL == xObject)
return;
// n = cJSON_AddNumberToObject(xRoot, "SHADHALKJF", 100);
// LOG_E("is num = %d",cJSON_IsNumber(n));
cJSON_AddStringToObject(xRoot, "Manufacturer", "hello world");
pJson =cJSON_PrintUnformatted(xRoot);
if(pJson == NULL)
{
LOG_W("NULL");
}
// pJson = cJSON_Print(xRoot);
rt_kprintf("%s\n", pJson);
if (pJson)
{
cJSON_free(pJson);
}
if (xRoot)
{
cJSON_Delete(xRoot);
}
}
结果:

可以创建json 字符串出来。
LOG_E("is num = %d",cJSON_IsNumber(n));
打印出来时正常的,说明能创建这个json 对象 于是我debug cJSON_PrintUnformatted()。

执行到这个if (!print_value(item, buffer)) 中跳转失败了。
继续往下走 json 字符串就创建失败了。
于是我将断点打到这个print_value() 函数中

确实能进入这个case里
单步进来 数字的长度报错。

接着 断点打在这个length 赋值的地方。 直接进入else中

单步下来 length 被赋值

这个值错了, d=100 赋值是正确的 于是我打开了菜鸟工具 C语言在线编译器

于是我就整不明白了。这个lenght 的长度为什么不对?。。。
接着我把这个长度强行改变它的值 lenght =3 发现


这我就更不明白了。。。
猜测是这个sprintf没有格式化输出这个浮点型字符串。 好 又开始下面的测试了。。。
int main(void)
{
// test();
int length = 0;
double d = 100.12;
char number_buffer[26] = {0};
length = sprintf((char*)number_buffer, "%1.15g",(double) d);
printf("length = %d\n", length);
printf("number_buffer = %s\n", number_buffer);
printf("double num = %lf\n",200.34);
for (;;)
{
rt_thread_mdelay(1000);
}
return RT_EOK;
}
...

问题的根源找到了 printf 不支持浮点型的格式化输出???
搞配置搞配置!!!


接着来搞 测试
void test(void)
{
cJSON *xRoot = RT_NULL;
cJSON *xObject = RT_NULL;
char *pJson = RT_NULL;
cJSON *n = RT_NULL;
xRoot = cJSON_CreateObject();
if (NULL == xRoot)
return;
xObject = cJSON_CreateObject();
if (NULL == xObject)
return;
n = cJSON_AddNumberToObject(xRoot, "SHADHALKJF", 100);
LOG_E("is num = %d", cJSON_IsNumber(n));
cJSON_AddStringToObject(xRoot, "Manufacturer", "hello world");
pJson = cJSON_PrintUnformatted(xRoot);
if (pJson == NULL)
{
LOG_W("NULL");
}
// pJson = cJSON_Print(xRoot);
rt_kprintf("%s\n", pJson);
if (pJson)
{
cJSON_free(pJson);
}
if (xRoot)
{
cJSON_Delete(xRoot);
}
}

哦了
关键很奇怪的就是 我原先没有加入这个浮点型的支持 它也可以使用 但是不是每次编译 都能使用 就很奇奇怪怪的
嗯嗯,是的。 但是这个C的链接选项好像就没了。