CJSON库是一个用于解析和生成JSON数据的C语言库。 它提供了一组函数,使得在C语言中操作JSON数据变得简单而高效。 您可以使用CJSON库来解析从服务器返回的JSON数据,或者将C语言数据结构转换为JSON格式以进行传输。
官网地址:https://sourceforge.net/projects/cjson/
cJSON只有一个cjson.h 和cjson.c 文件,可以很方便的集成到其他项目中。cJSON支持将JSON数据解析为cJSON对象,也支持将cJSON对象转换为JSON数据。cJSON的使用非常简单,只需要包含 cjson.h 头文件,然后调用相应的API即可完成JSON数据的解析和生成。
新增cjson_demo1.c 文件
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include "cJSON.h"
- /**
- * 目标:1、引入cjson 库依赖文件(cJSON.c/cJSON.h)
- * 2、cjson 库基本使用
- */
- int main(){
- // 第一步:创建cJSON 对象
- cJSON *jsonObject = cJSON_CreateObject();
- // 第二步:输出cJSON 对象
- char *content = cJSON_Print(jsonObject);
- printf("%s\n", content);
- // 第三步:cJSON 对象添加属性:基本属性之字符串
- cJSON_AddItemToObject(jsonObject, "name", cJSON_CreateString("周志刚"));
- content = cJSON_Print(jsonObject);
- printf("%s\n", content);
- // 第三步:cJSON 对象添加属性:基本属性之整形
- cJSON_AddItemToObject(jsonObject, "age", cJSON_CreateNumber(32));
- content = cJSON_Print(jsonObject);
- printf("%s\n", content);
- // 第三步:cJSON 对象添加属性:基本属性之bool
- cJSON_AddItemToObject(jsonObject, "man", cJSON_CreateBool(1));
- content = cJSON_Print(jsonObject);
- printf("%s\n", content);
- // 第三步:cJSON 对象添加属性:基本属性之NULL
- cJSON_AddItemToObject(jsonObject, "woman", cJSON_CreateNull());
- content = cJSON_Print(jsonObject);
- printf("%s\n", content);
- // 第四步:cJSON 对象添加属性:复杂属性之数组
- cJSON * childs = cJSON_CreateArray();
- cJSON_AddItemToArray(childs, cJSON_CreateString("周晨曦"));
- cJSON_AddItemToArray(childs, cJSON_CreateString("周晨宇"));
- cJSON_AddItemToObject(jsonObject, "childs", childs);
- content = cJSON_Print(jsonObject);
- printf("%s\n", content);
- // 第四步:cJSON 对象添加属性:复杂属性之cJSON对象
- cJSON *wife = cJSON_CreateObject();
- cJSON_AddItemToObject(wife, "name", cJSON_CreateString("王珍"));
- cJSON_AddItemToObject(jsonObject, "wife", wife);
- content = cJSON_Print(jsonObject);
- printf("%s\n", content);
-
- // 第五步:输出json 字符串到指定文件
- FILE *file = fopen("output.json", "w+");
- if(file == NULL){
- perror("fopen failed !!\n");
- return -1;
- }
- char buffer[1024];
- // 初始化
- memset(buffer, 0,1024);
- // 赋值
- strcpy(buffer, content);
- int length = strlen(buffer);
- // 文件写入
- if(fwrite(buffer, length, 1, file) <=0){
- perror("fwrite failed !!\n");
- return -1;
- }
- // 文件关闭
- fclose(file);
-
- // 释放cJSON 对象和字符串
- cJSON_Delete(jsonObject);
-
- free(content);
- return 0;
- }
编译:gcc cJSON.c cjson_demo1.c -o cjson_demo1 -lm
执行:./cjson_demo1
执行效果:
新增cjson_demo2.c 文件
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include "cJSON.h"
- /**
- * 目标:1、引入cjson 库依赖文件(cJSON.c/cJSON.h)
- * 2、cjson 库基本使用
- */
- int main(){
-
- // 第一步:从指定文件读取json 字符串
- FILE *file = fopen("output.json", "r");
- if(file == NULL){
- perror("fopen failed !!\n");
- return -1;
- }
- char buffer[1024];
- // 初始化
- memset(buffer, 0,1024);
- // 文件读取
- fread(buffer, 1024, 1, file);
- // 文件关闭
- fclose(file);
-
- // 第二步:解析json 字符串
- cJSON *jsonObject = cJSON_Parse(buffer);
- if(jsonObject == NULL){
- perror("Parse failed!\n");
- return -1;
-
- }
- // 第三步:解析键值对
- cJSON *name =cJSON_GetObjectItem(jsonObject, "name");
- char *content = cJSON_Print(name);
- printf("%s\n", content);
-
- // 第四步: 解析JSON对象
- cJSON *wife = cJSON_GetObjectItem(jsonObject, "wife");
- content = cJSON_Print(wife);
- printf("%s\n", content);
-
- // 第五步: 解析JSON数组
- cJSON *childs = cJSON_GetObjectItem(jsonObject, "childs");
- content = cJSON_Print(childs);
- printf("%s\n", content);
-
-
- // 释放cJSON 对象和字符串
- cJSON_Delete(jsonObject);
-
- free(content);
-
- return 0;
- }
编译:gcc cJSON.c cjson_demo2.c -o cjson_demo2 -lm
执行:./cjson_demo2
执行效果:
问题一:找不到pow和floor函数:undefined reference to pow' 和 undefined reference to
floor’
解决办法: 编译需要添加math库/libm,在编译代码中添加"-lm"。