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

乐鑫云平台在对接的时候,可以使用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”就ok啦~

#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;
}

编译运行:

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

发布了156 篇原创文章 · 获赞 489 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/Mculover666/article/details/103794279