keil JSON库-Jansson

在写ESP8266模块与Qt通信时使用json格式传输数据,有cJSON与Jansson可选择。我选择了keil提供的JSON库 Jansson,没过多了解过cJSON,也不知道哪个更好,Jansson毕竟是keil提供的库,所以就选了Jansson。但貌似使用Jansson的并不多,学习起来只能慢慢啃英文文档了,由于对Jansson不是很熟悉,踩了不少坑

下载安装Keil::Jansson

STM32 keil提供的JSON库 Jansson

keil JSON库-Jansson_第1张图片

keil JSON库-Jansson_第2张图片

keil JSON库-Jansson_第3张图片

 

打开keil工程,点击下图的最右端的图标配置Json库到工程中

keil JSON库-Jansson_第4张图片

Jansson使用 

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。

 

你可能感兴趣的:(---)