技术专栏
cJSON的使用实例Demo(平时使用这篇内容完全足够了)
概述:
在嵌入式开发过程中,我们在与服务器通信过程可能会使用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
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
<
运行结果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个
手气红包

相关专栏
-
浏览量:3351次2020-08-20 11:09:57
-
浏览量:4387次2020-08-20 11:08:00
-
浏览量:1991次2020-06-23 12:49:33
-
浏览量:791次2023-12-14 16:14:59
-
浏览量:1769次2020-08-14 18:41:11
-
浏览量:694次2023-12-22 22:16:53
-
2021-01-15 12:22:23
-
浏览量:2625次2020-08-04 15:11:02
-
浏览量:1502次2020-09-09 19:14:23
-
浏览量:2989次2019-12-05 17:38:34
-
浏览量:6835次2018-01-22 14:23:15
-
浏览量:4340次2020-08-18 19:31:22
-
浏览量:6596次2022-01-07 09:00:13
-
浏览量:1660次2020-07-03 14:40:34
-
浏览量:2786次2017-11-22 11:51:03
-
浏览量:1325次2023-07-27 10:34:40
-
浏览量:9433次2020-08-18 21:11:17
-
浏览量:5372次2019-12-28 10:17:47
-
浏览量:1419次2019-01-03 17:04:39
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者

在学了在学了!
您的支持将鼓励我继续创作!
打赏金额:
¥1

¥5

¥10

¥50

¥100

支付方式:

举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注