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

原文出处:https://blog.csdn.net/Dancer__Sky/article/details/85247249

概述:

     在嵌入式开发过程中,我们在与服务器通信过程可能会使用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(数组包的封包解包):

  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值