首页 > 技术知识 > 正文

概述:

在嵌入式开发过程中,我们在与服务器通信过程可能会使用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(基本包的封包解包): cJSON的使用实例Demo(平时使用这篇内容完全足够了)

运行结果2(数组包的封包解包): cJSON的使用实例Demo(平时使用这篇内容完全足够了)1

完整项目包: 包下载地址: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

猜你喜欢