查看原文
其他

骚操作!快速创建JSON数据和解析JSON数据

mculover666 Mculover666 2021-01-31

在对接乐鑫云物联网平台的时候,可以使用tcp socket发送和接收json数据进行交互,之前专门写了一篇文章,介绍cJSON的使用,而,看了乐鑫给的官方代码后,正应了这句话,突如其来的骚,闪了老子的腰!

1.快速生成JSON数据

核心思想:构造字符串!

这里我拿设备激活举个例子,设备激活的数据格式如下:

{"path": "/v1/device/activate/", "method": "POST", "meta": {"Authorization": "token HERE_IS_THE_MASTER_DEVICE_KEY"}, "body": {"encrypt_method": "PLAIN", "bssid": ":bssid", "token": ":token"}}

其中:

  • HERE_IS_THE_MASTER_DEVICE_KEY:填写之前获取的秘钥;
  • bssid:填写设备MAC地址;
  • token :随机值即可,可以留空;

这样的一条数据,如果使用cJSON的函数一条一条创建,既代码量大,而且内存占用量也很大,接下来向大家介绍一个骚扰操作,看完后,我相信你会点赞的!

首先直接使用宏定义将整段JSON字符串转化为:

#define ACTIVE_DATA \
"{\n\"path\": \"/v1/device/activate/\",\n\
\"method\": \"POST\",\n\
\"meta\":\
{\"Authorization\": \"token %s\"},\n\
\"body\":\
{\"encrypt_method\": \"PLAIN\",\
\"bssid\": \"%s\",\
\"token\": \":\"}\n}\n"

然后一行命令即可构造出将其中两个需要用户指定的值定义:

#define TOKEN "ef97b306620d5e9de19d7b2131742b152b2e94d0"
#define BSSID "dc:4f:22:5e:90:b7"

最后一行代码解决问题,简洁到爆炸:

sprintf(active_data, ACTIVE_DATA, TOKEN, BSSID);

整段程序如下:

#include <stdio.h>
#include <stdlib.h>

#define ACTIVE_DATA \
"{\n\"path\": \"/v1/device/activate/\",\n\
\"method\": \"POST\",\n\
\"meta\":\
{\"Authorization\": \"token %s\"},\n\
\"body\":\
{\"encrypt_method\": \"PLAIN\",\
\"bssid\": \"%s\",\
\"token\": \":\"}\n}\n"


#define TOKEN "ef97b306620d5e9de19d7b2131742b152b2e94d0"
#define BSSID "dc:4f:22:5e:90:b7"

int main(void)
{
char* active_data = malloc(300);
sprintf(active_data, ACTIVE_DATA, TOKEN, BSSID);
printf(active_data);
return 0;
}

编译运行:

2.快速解析

"deliver_to_device": true, "get": "action": "LED_ON", "meta": "Authorization": "token 8668c64f40d172be31eb4f12cbcaf4e57c9e1e3c", "Time-Zone": "Asia/Shanghai", "method": "GET", "nonce": 587250592, "path": "/v1/device/rpc/"

其中想要的数据只有:

所以,为什么要浪费精力,浪费代码,浪费内存去用cJSON条一条解析数据,而且解析出来有用的值只有“ LED_ON”,所以直接使用C库函数strstr()判断与此字符串中有没有“ LED_ON”就可以啦〜

#include <stdio.h>
#include <string.h>

char rpc_cmd[] = "\
\"deliver_to_device\": true,\
\"get\": \"action\": \"LED_ON\",\
\"meta\": \"Authorization\": \"token 8668c64f40d172be31eb4f12cbcaf4e57c9e1e3c\",\
\"Time-Zone\": \"Asia/Shanghai\",\
\"method\": \"GET\",\
\"nonce\": 587250592,\
\"path\": \"/v1/device/rpc/\"\
"
;

int main(void)
{
if(strstr(rpc_cmd, "LED_ON"))
{
printf("LED need to turn on!\n");
}
return 0;
}

编译运行:

这样生成和解析的骚动,你学会了吗?哈哈哈〜虽然流氓一点,但是真的很好用,学会的话点个赞吧!

更多精彩文章及资源,欢迎关注我的微信公众号:『mculover666』。

Modified on

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存