在写ESP8266模块与Qt通信时使用json格式传输数据,有cJSON与Jansson可选择。我选择了keil提供的JSON库 Jansson,没过多了解过cJSON,也不知道哪个更好,Jansson毕竟是keil提供的库,所以就选了Jansson。但貌似使用Jansson的并不多,学习起来只能慢慢啃英文文档了,由于对Jansson不是很熟悉,踩了不少坑
STM32 keil提供的JSON库 Jansson
打开keil工程,点击下图的最右端的图标配置Json库到工程中
Jansson_API
使用前#include
方法在返回引用前开辟了空间,使用时应增大堆空间,在startup_stm32f10x_hd.s中增大
Heap_Size EQU value
json添加元素,key为data或data.id格式,最多2层,使用的是object
u8 json_add(json_t *injson,char *key,char *value)
{
if(strstr(key,"."))
{
json_t *tempobj;
char fkey[20];
u8 i=0;
for(i=0;*key!='.';i++,key++)
*(fkey+i)=*key;
*(fkey+i)=0;
key++;
tempobj=json_object_get(injson,fkey);
if(tempobj==NULL)
{
tempobj=json_object();
//使用json_object_set_new窃取value的引用。当值是新创建的并且在调用之后不使用时
json_object_set_new(tempobj, key, json_string(value));
json_object_set_new(injson,fkey,tempobj);
}
else
{
json_object_set_new(tempobj, key, json_string(value));
json_object_set(injson,fkey,tempobj);
}
}
else json_object_set_new(injson,key,json_string(value));
return 1;
}
使用前,应注意injson必须先分配空间,使用后也的记得释放空间,之前由于没仔细看api,所以卡在内存这块了
json_t *injson=json_object();
json_decref(injson); //释放,试过了free,json_object_clear都不可以
json查找元素(节点不包含array),key为data或data.id格式
u8 json_find(json_t *injson,char *key,char *ret)
{
if(json_is_array(injson) && json_array_size(injson)==0)return 0;
if(json_is_object(injson) && json_object_size(injson)==0)return 0;
if(json_is_object(injson))
{
char keytemp[20];
const char *k;
json_t *v;
int i=0;
if(strstr(key,"."))
{
for(i=0;*key!='.';i++,key++)
*(keytemp+i)=*key;
*(keytemp+i)=0;
}
else
strcpy(keytemp,key);
json_object_foreach(injson, k, v)
{
if(strlen(k)==strlen(keytemp) && strstr(k,keytemp))
{
if(strlen(keytemp)==strlen(key) && strstr(keytemp,key))
{
strcpy(ret,json_string_value(v));
return 1;
}
else
{
key++;
if(json_find(json_object_get(injson,k),key,ret))
{
return 1;
}
}
}
}
return 0;
}
else if(json_is_array(injson))
{
u8 i=0;
for(;i
Qt上可以使用JsonReader。