• C 开源库之cJSON


    cJSON简介 

            CJSON库是一个用于解析和生成JSON数据的C语言库。 它提供了一组函数,使得在C语言中操作JSON数据变得简单而高效。 您可以使用CJSON库来解析从服务器返回的JSON数据,或者将C语言数据结构转换为JSON格式以进行传输。

    cJSON 使用

    官网地址:https://sourceforge.net/projects/cjson/

    cJSON只有一个cjson.h 和cjson.c 文件,可以很方便的集成到其他项目中。cJSON支持将JSON数据解析为cJSON对象,也支持将cJSON对象转换为JSON数据。cJSON的使用非常简单,只需要包含 cjson.h 头文件,然后调用相应的API即可完成JSON数据的解析和生成。

    cJSON 数据生成

    新增cjson_demo1.c 文件

    1. #include<stdio.h>
    2. #include<string.h>
    3. #include<stdlib.h>
    4. #include "cJSON.h"
    5. /**
    6. * 目标:1、引入cjson 库依赖文件(cJSON.c/cJSON.h)
    7. * 2、cjson 库基本使用
    8. */
    9. int main(){
    10. // 第一步:创建cJSON 对象
    11. cJSON *jsonObject = cJSON_CreateObject();
    12. // 第二步:输出cJSON 对象
    13. char *content = cJSON_Print(jsonObject);
    14. printf("%s\n", content);
    15. // 第三步:cJSON 对象添加属性:基本属性之字符串
    16. cJSON_AddItemToObject(jsonObject, "name", cJSON_CreateString("周志刚"));
    17. content = cJSON_Print(jsonObject);
    18. printf("%s\n", content);
    19. // 第三步:cJSON 对象添加属性:基本属性之整形
    20. cJSON_AddItemToObject(jsonObject, "age", cJSON_CreateNumber(32));
    21. content = cJSON_Print(jsonObject);
    22. printf("%s\n", content);
    23. // 第三步:cJSON 对象添加属性:基本属性之bool
    24. cJSON_AddItemToObject(jsonObject, "man", cJSON_CreateBool(1));
    25. content = cJSON_Print(jsonObject);
    26. printf("%s\n", content);
    27. // 第三步:cJSON 对象添加属性:基本属性之NULL
    28. cJSON_AddItemToObject(jsonObject, "woman", cJSON_CreateNull());
    29. content = cJSON_Print(jsonObject);
    30. printf("%s\n", content);
    31. // 第四步:cJSON 对象添加属性:复杂属性之数组
    32. cJSON * childs = cJSON_CreateArray();
    33. cJSON_AddItemToArray(childs, cJSON_CreateString("周晨曦"));
    34. cJSON_AddItemToArray(childs, cJSON_CreateString("周晨宇"));
    35. cJSON_AddItemToObject(jsonObject, "childs", childs);
    36. content = cJSON_Print(jsonObject);
    37. printf("%s\n", content);
    38. // 第四步:cJSON 对象添加属性:复杂属性之cJSON对象
    39. cJSON *wife = cJSON_CreateObject();
    40. cJSON_AddItemToObject(wife, "name", cJSON_CreateString("王珍"));
    41. cJSON_AddItemToObject(jsonObject, "wife", wife);
    42. content = cJSON_Print(jsonObject);
    43. printf("%s\n", content);
    44. // 第五步:输出json 字符串到指定文件
    45. FILE *file = fopen("output.json", "w+");
    46. if(file == NULL){
    47. perror("fopen failed !!\n");
    48. return -1;
    49. }
    50. char buffer[1024];
    51. // 初始化
    52. memset(buffer, 0,1024);
    53. // 赋值
    54. strcpy(buffer, content);
    55. int length = strlen(buffer);
    56. // 文件写入
    57. if(fwrite(buffer, length, 1, file) <=0){
    58. perror("fwrite failed !!\n");
    59. return -1;
    60. }
    61. // 文件关闭
    62. fclose(file);
    63. // 释放cJSON 对象和字符串
    64. cJSON_Delete(jsonObject);
    65. free(content);
    66. return 0;
    67. }

    编译:gcc cJSON.c cjson_demo1.c -o cjson_demo1 -lm

    执行:./cjson_demo1

    执行效果:

     

     cJSON 数据解析

    新增cjson_demo2.c 文件

    1. #include<stdio.h>
    2. #include<string.h>
    3. #include<stdlib.h>
    4. #include "cJSON.h"
    5. /**
    6. * 目标:1、引入cjson 库依赖文件(cJSON.c/cJSON.h)
    7. * 2、cjson 库基本使用
    8. */
    9. int main(){
    10. // 第一步:从指定文件读取json 字符串
    11. FILE *file = fopen("output.json", "r");
    12. if(file == NULL){
    13. perror("fopen failed !!\n");
    14. return -1;
    15. }
    16. char buffer[1024];
    17. // 初始化
    18. memset(buffer, 0,1024);
    19. // 文件读取
    20. fread(buffer, 1024, 1, file);
    21. // 文件关闭
    22. fclose(file);
    23. // 第二步:解析json 字符串
    24. cJSON *jsonObject = cJSON_Parse(buffer);
    25. if(jsonObject == NULL){
    26. perror("Parse failed!\n");
    27. return -1;
    28. }
    29. // 第三步:解析键值对
    30. cJSON *name =cJSON_GetObjectItem(jsonObject, "name");
    31. char *content = cJSON_Print(name);
    32. printf("%s\n", content);
    33. // 第四步: 解析JSON对象
    34. cJSON *wife = cJSON_GetObjectItem(jsonObject, "wife");
    35. content = cJSON_Print(wife);
    36. printf("%s\n", content);
    37. // 第五步: 解析JSON数组
    38. cJSON *childs = cJSON_GetObjectItem(jsonObject, "childs");
    39. content = cJSON_Print(childs);
    40. printf("%s\n", content);
    41. // 释放cJSON 对象和字符串
    42. cJSON_Delete(jsonObject);
    43. free(content);
    44. return 0;
    45. }

    编译:gcc cJSON.c cjson_demo2.c -o cjson_demo2 -lm

    执行:./cjson_demo2

    执行效果:

     

    cJSON 问题 

    问题一:找不到pow和floor函数:undefined reference to pow' 和 undefined reference tofloor’

    解决办法: 编译需要添加math库/libm,在编译代码中添加"-lm"。

  • 相关阅读:
    三翼鸟三周年:三次升级,全面引领
    vue项目使用vue-video-player实现视频直播功能
    springboot redis自定义连接工厂
    7/20 时事
    php获取今天凌晨零点的时间
    Windows线程 信号量 CreateSemaphore创建信号量、RelaseSemaphore设置信号量
    自建网上商城平台该如何做好运营?
    【基础IO⑨】:重定向实现原理 &&“Linux下一切皆文件“
    主机jvisualvm连接到tomcat服务器查看jvm状态
    高级 ECharts 技巧:自定义图表主题与样式
  • 原文地址:https://blog.csdn.net/zhouzhiwengang/article/details/141203716