关于单片机的 json解析

因为项目使用到了网络,与服务进行http通讯,所以选择了使用json方式。

单片机通过串口与wifi模块,获取网络上的数据包,根据字符串处理拿到传输的json字符。

在单片机上处理json的方式简单发现了3种,开始用了frozen,在使用过程发现总在调用free()函数的时候卡死;

百度了一通,发现要把 head 的大小设置大一点。从512到8196,发现都不行,进而想是不是rt-thread嵌太深,

把栈撑坏了,又把栈给加大,也是在处理完一次json后死掉。

随想换一种方式解析,看看keil软件给自带了一种方式,网上推荐的还有 cJSON。去MDK官网下载支持包,

发现既有 jsmn 也有 cJSON的,前者网上只发现了打包的案例,加上又去掉了。所以最后用的是 cJSON的

方式,这种方式的案例网上有很多。按着搞了,也是不行,差不多与使用frozen遇到的情况一样。

看网上的都是自己构建json字符然后解析的。自己的是直接获取自己从服务器上返回的数据。我的json也没

毛病啊。随也简单构建了一个json自己写在单片机的代码上。发现可以了。想到自己从服务器上返回的json

包含整型数据。在串口打印的时候,整形数据没有被双引号引起。在服务器上把整形两边加上双引号,

解析成功。然后 ato() 方法把字符转换为整型,再用 %d 输出,嗯,就这样没啥毛病。这个坑让我试了两个方案,

花掉半个下午的时间。

	//	json_start = "{\"msg\":\"OK\",\"status\":\"200\"}";
		
		json = cJSON_Parse(json_start);
		if(json == NULL){  // 		printf("get json err..\r\n");
		}else{
		cJSON* item = cJSON_GetObjectItem(json,"status");
			printf("status:%d\r\n",atoi(item->valuestring));	
//			cJSON_Delete(item);
			cJSON_Delete(json);
			printf("get json ok..\r\n");
		}

 

你可能感兴趣的:(AIOT,单片机,网络)