前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >骚操作!快速创建JSON数据和解析JSON数据

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

作者头像
Mculover666
发布2020-07-16 14:19:07
2.3K0
发布2020-07-16 14:19:07
举报
文章被收录于专栏:TencentOS-tiny

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

1.快速生成JSON数据

核心思想:构造字符串!

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

代码语言:javascript
复制
{"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字符串转化为:

代码语言:javascript
复制
#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"

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

代码语言:javascript
复制
#define TOKEN   "ef97b306620d5e9de19d7b2131742b152b2e94d0"
#define BSSID   "dc:4f:22:5e:90:b7"

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

代码语言:javascript
复制
sprintf(active_data, ACTIVE_DATA, TOKEN, BSSID);

整段程序如下:

代码语言:javascript
复制
#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.快速解析

代码语言:javascript
复制
"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”就可以啦〜

代码语言:javascript
复制
#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;
}

编译运行:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Mculover666 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.快速生成JSON数据
  • 2.快速解析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档