[笔记]Cjson在STM32中的使用

写在前面

目前对于ESP8266的了解还远远不够,只了解esp8266这款芯片是自带 mcu的,网上搜索的关于ESP8266的教程都是基于ESP8266开发板展开的,所以开始对于如何使用这个模块很是懵逼,通过查找资料,对其有一定的了解,并且了解到在和stm32一起使用的时候需要使用AT相关的指令,目前对于这一块还不是很了解,但通过开发板的例程还是可以分析一点门路的。

今天在一个博客上看到一篇关于 使用stm32+esp8266做实时天气预报的帖子,通过esp8266链接“丫丫天气”的服务器API接口,通过 GET请求数据。这里有一个关键点,也一直是困扰我的,就是通过服务器请求回来的数据是json格式的,所以如何从一堆的数据中提取出关键的数据呢?这篇文章给出他的解决方案,就是 cjson

原博客的地址是: STM32+ESP8266获取天气信息并显示到lcd

作者关于处理json数据的原话是:从获取到的信息可以看到,数据是json格式,而且没有gbk编码,要正常显示到LCD的话,要用cjson把我们需要的字段取出,并转换成gbk。

关于后面的 gbk编码我还没了解,我先去了解了下什么是cjson?

JSON全称为Javascript Object Notation,是一种轻量级的数据交换格式,越来越多的嵌入式设备需要联网进行数据交互,而json就是其中一个比较流行的数据交换格式,具有多种语言版本,在stm32使用中使用的是C语言版本。

json的使用,这里通过一个网上简单的例子说明。

  • 创建一个JSON对象,并加入数据。
  • JSON对象转换为字符串。
  • 将字符串解析为JSON对象,并从中提取数据。

Step1 .创建JSON对象,并向其中加入数据

1
2
3
4
5
6
7
8
//创建JSON对象
cJSON *info;
info=cJSON_CreateObject();

//添加数据
cJSON_AddStringToObject(info,"sex","male");
cJSON_AddNumberToObject(info,"age","20");
cJSON_AddStringToObject(info,"name","weijun");

Step2 .将JSON对象转换为字符串

1
2
3
4
//字符指针
char *jsonStr;
//转换函数
jsonStr=cJSON_Print(info);

Step3 .将字符串转换为JSON并提取数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//创建JSON对象
cJSON *root;
cJSON *name;
char *exeStr;

//将json数据解析成json结构体
root=cJSON_Parse(jsonStr);
if(!root){
print("get root failed!\n");
printf("Error before: [%s]\n", cJSON_GetErrorPtr());
}
//获取数据
name = cJSON_GetObjectItem(root, "name");
if (!name) {
printf("get name faild !\n");
printf("Error before: [%s]\n", cJSON_GetErrorPtr());
}
//转移数据到指针
exeStr = (char*)malloc(strlen(name->valuestring));
sprintf(exeStr,"%s",name-valuestring);

//内存回收
cJSON_Delete(root);

或者另外一个例子用来表示json的使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
char* pszJsonText = "{\"result\":{\"id\":1,\"name\":\"aa\",\"datetime\":\"2016-04-25 16:38:54\",\"status\":1}, \
\"code\":10000,\"message\":\"ok\",\"sign\":901498365}";

typedef struct
{
u32 cID;
char *pName;
char *datetime;
u8 cStatus;
}SCAN_CODE_LIST_MEM_TypeDef;

SCAN_CODE_LIST_MEM_TypeDef g_stScanCodeListMem;

u8 ParseScanCodeJson(const char* pszJsonText)
{
cJSON *root, *result;
u32 code=0;
u8 ret = FALSE;

//将json数据解析成json结构体
root= cJSON_Parse(pszJsonText);

if (root)
{
//从根节点获取code元素的值 int型
code = cJSON_GetObjectItem(root, "code")->valueint;

if(code != 10001)
{
//从根节点获取result节点
result = cJSON_GetObjectItem(root, "result");

if (result)
{
//从result节点获取各个元素的值
g_stScanCodeListMem.cID = cJSON_GetObjectItem(result, "id")->valueint; //int 型
g_stScanCodeListMem.pName = cJSON_GetObjectItem(result, "name")->valuestring;//字符串型
g_stScanCodeListMem.datetime = cJSON_GetObjectItem(result, "datetime")->valuestring;//字符串型
g_stScanCodeListMem.cStatus = cJSON_GetObjectItem(result, "status")->valueint;//int 型

//保存扫描用户的名字 把id值也作为一个参数存入
WriteScanCodeName(g_stScanCodeListMem.pName, g_stScanCodeListMem.cID);

#ifdef DEBUG_APP_TASK
printf("\r\n");
printf(" cID:%d ", g_stScanCodeListMem.cID);
printf(" pName:%s", g_stScanCodeListMem.pName);
printf(" datetime:%s ", g_stScanCodeListMem.datetime);
printf(" cStatus:%d ", g_stScanCodeListMem.cStatus);
printf("\r\n");
#endif
ret = TRUE;
}
}

//释放资源
cJSON_Delete(root);
}

return ret;
}

亦或者另一个实例,stm32使用cJSON库提取解析json数据例程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void testJson()
{

char *out;cJSON *json,*jsonTemp;

json=cJSON_Parse((char *)USART1_RX_BUF);
if (!json) {printf("Error before: [%s]\n",cJSON_GetErrorPtr());}
else
{
out=cJSON_Print(json);
printf("%s:%x:%x\n",out,json,out);
jsonTemp=cJSON_GetObjectItem(json,"name");
printf("name:%s\n",jsonTemp->valuestring);
jsonTemp=cJSON_GetArrayItem(json,1);
printf("phone:%d\n",jsonTemp->valueint);
jsonTemp=cJSON_GetArrayItem(json,2);
jsonTemp=cJSON_GetArrayItem(jsonTemp,0);
printf("params-area:%s\n",jsonTemp->valuestring);
cJSON_Delete(json);
myfree(SRAMEX,out);
}
}

img

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×