cJSON的使用实例Demo(平时使用这篇内容完全足够了)

在学了在学了! 2020-08-20 11:12:38 10119

概述:

在嵌入式开发过程中,我们在与服务器通信过程可能会使用json包形式传输数据,那cJSON这个轻量库就要登场了。由于cJSON库只需使用cJSON.c和cJSON.h这两个文件,我们一般就直接拿过来用啦。通过这个库我们可以轻松的实现json数据包的封包解包。这里是我整理的一个demo,基本注释都在代码注释,还有注意事项,平时使用到的基本全部都用到了,所以看这个实例找到你需要的部分用起来就OK了。
实例Demo:

#include <stdio.h>

#include <stdlib.h>

#include <stdint.h>

#include <string.h>

#include "./cjson/cJSON.h"

/*

    注意:

        通过cJSON_PrintUnformatted(),cJSON_Print()函数返回的字符串需要手动free(释放空间)

        cJSON_CreateObject()函数创造的数据不使用时需要使用cJSON_Delete()释放空间

*/

/*cJSON的基本封装*/

cJSON *basic_cjson_pkg(void)

{

    cJSON *root = cJSON_CreateObject();

    if (NULL == root) {

        return NULL;

    }

    cJSON_AddNumberToObject(root, "action", 666); 

    cJSON *data = cJSON_CreateObject();

    if (NULL == data) {

        goto err1;

    }

    cJSON_AddStringToObject(data, "user", "Sky.J");

    cJSON_AddStringToObject(data, "pwd", "123456");

    cJSON_AddItemToObject(root, "data", data);

    return root;

err1:

    cJSON_Delete(root);

    return NULL;

}

/*cJSON的基本解析*/

void basic_cjson_sys(cJSON *root)

{

    if (NULL == root) {

        return ;

    }

    //将json包转为字符串显示,一般我们使用时选择str1,str2这种方式是更加容易我们观看的方式

    char *str1 = cJSON_PrintUnformatted(root);

    char *str2 = cJSON_Print(root);

    printf("str1: \r\n%s\r\n", str1);

    printf("str2: \r\n%s\r\n", str2);

    cJSON_Delete(root);

    free(str2);

    //一般我们接收到的也是cjson类型的字符串str1,下面解析

    //将字符串格式cjson数据转为cJSON类型数据

    cJSON *sys_root = cJSON_Parse(str1);

    if (NULL == sys_root) {

        goto err1;

    }

    cJSON *action = cJSON_GetObjectItem(sys_root, "action");

    if (NULL == action) {

        goto err2;

    }

    int action_value = action->valueint;

    cJSON *data = cJSON_GetObjectItem(sys_root, "data");

    if (NULL == data) {

        goto err2;

    }

    cJSON *user = cJSON_GetObjectItem(data, "user");

    if (NULL == user) {

        goto err2;

    }

    char *user_value = user->valuestring;

    cJSON *pwd = cJSON_GetObjectItem(data, "pwd");

    if (NULL == pwd) {

        goto err2;

    }

    char *pwd_value = pwd->valuestring;

    printf("action = %d, user = %s, pwd = %s\r\n", action_value, user_value, pwd_value);

err2:

    cJSON_Delete(sys_root);

err1:

    free(str1);

    return ;

}

/*cJSON的数组封装*/

cJSON *array_cjson_pkg(void)

{

    int i;

    char buffer[20];

    cJSON *root = cJSON_CreateObject();

    if (NULL == root) {

        return NULL;

    }

    cJSON_AddNumberToObject(root, "action", 888); 

    cJSON *data = cJSON_CreateObject();

    if (NULL == data) {

        goto err1;

    }

    cJSON_AddItemToObject(root, "data", data);

    cJSON *rows = cJSON_CreateArray();

    if (NULL == rows) {

        goto err1;

    }

    cJSON_AddItemToObject(data, "rows", rows);

    for (i = 0; i < 3; i++) {

        memset(buffer, 0, sizeof(buffer));

        snprintf(buffer, sizeof(buffer), "user%d", i);

        cJSON *row = cJSON_CreateObject();

        if (NULL == row) {

            goto err1;

        }

        //将新建项目插入数组中

        cJSON_AddItemToArray(rows, row);

        //添加详细信息

        cJSON_AddStringToObject(row, "user", buffer);

        cJSON_AddStringToObject(row, "pwd", "123456");

    }

    return root;

err1:

    cJSON_Delete(root);

    return NULL;

}

/*cJSON的数组解析*/

void array_cjson_sys(cJSON *root)

{

    if (NULL == root) {

        return ;

    }

    //将json包转为字符串显示,一般我们使用时选择str1,str2这种方式是更加容易我们观看的方式

    char *str1 = cJSON_PrintUnformatted(root);

    char *str2 = cJSON_Print(root);

    printf("str1: \r\n%s\r\n\r\n", str1);

    printf("str2: \r\n%s\r\n\r\n", str2);

    cJSON_Delete(root);

    free(str2);

    //一般我们接收到的也是cjson类型的字符串str1,下面解析

    //将字符串格式cjson数据转为cJSON类型数据

    cJSON *sys_root = cJSON_Parse(str1);

    if (NULL == sys_root) {

        goto err1;

    }

    cJSON *action = cJSON_GetObjectItem(sys_root, "action");

    if (NULL == action) {

        goto err2;

    }

    int action_value = action->valueint;

    cJSON *data = cJSON_GetObjectItem(root, "data");

    if (NULL == data) {

        goto err2;

    }

    //解析数组

    cJSON *rows = cJSON_GetObjectItem(data, "rows");

    if (NULL == rows) {

        goto err2;

    }

    int array_cnt = cJSON_GetArraySize(rows);

    printf("\r\naction = %d, array_cnt = %d\r\n", action_value, array_cnt);

    int i;

    for (i = 0; i < array_cnt; i ++) {

        //取出单个数组

        cJSON *row = cJSON_GetArrayItem(rows, i);

        if (NULL == row) {

            goto err2;

        }

        cJSON *user = cJSON_GetObjectItem(row, "user");

        if (NULL == user) {

            goto err2;

        }

        cJSON *pwd = cJSON_GetObjectItem(row, "pwd");

        if (NULL == pwd) {

            goto err2;

        }

        printf("user: %s, pwd: %s\r\n", user->valuestring, pwd->valuestring);

    }

err2:

    cJSON_Delete(sys_root);

err1:

    free(str1);

    return ;

}

int main()

{

    #if 1

    cJSON *root = basic_cjson_pkg();

    basic_cjson_sys(root);

    #else

    cJSON *root = array_cjson_pkg();

    array_cjson_sys(root);

    #endif

    return 0;

}

运行结果1(基本包的封包解包):

运行结果2(数组包的封包解包):

完整项目包:
包下载地址:https://download.csdn.net/download/dancer__sky/10875178.

//项目包使用方式(项目包有个问题,请将60行cJSON *data = cJSON_GetObjectItem(root, "data")的root改为sys_root)

1,下载项目包,解压进入包目录

2,mkdir build 创建build目录文件夹

3,cd build 进入build文件夹

4, cmake ..

5,make

6, ./cjson_test

原文连接:https://blog.csdn.net/Dancer__Sky/article/details/85247249

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
在学了在学了!
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区