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使用 

Jansson_API

使用前#include <jansson.h>

方法在返回引用前开辟了空间,使用时应增大堆空间,在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<json_array_size(injson);i++)
		if(json_find(json_array_get(injson,i),key,ret))
		{
			return 1;
		}
	}
	return 0;
}

Qt上可以使用JsonReader。

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值