查看原文
其他

使用cJSON库解析和构建JSON字符串

wcc149 电子电路开发学习 2021-01-31

前言

其实之前的两篇博文已经介绍了json格式和如何使用cJSON库来解析JSON:

当时在MCU平台上使用时,会出现时间长了死机的情况,在调用cJSON_Print输出格式化后的JSON数据之后,

  1. LOG("JSON数据:\n%s\n", cJSON_Print(root));

要使用cJSON_Delete释放内存,否则会导致内存泄漏。

  1. cJSON_Delete(root); //调用cJSON_Print时才需要

这一点在嵌入式开发平台要格外注意。

解析和构建JSON的示例程序,我都已经上传到代码托管平台上,示例工程基于CodeBlocks开发环境。

  • Github仓库地址:

    https://github.com/whik/cJSON_Demo

  • Gitee仓库地址:

    https://gitee.com/whik/cJSON_Demo

或者通过下面的命令clone到本地:

Github:

  1. git clone https://gitee.com/whik/cJSON_Demo.git

Gitee:

  1. git clone https://github.com/whik/cJSON_Demo.git

JSON解析示例包括:

  • 和风天气实时数据

  • 心知天气实时数据

  • 心知天气3天预报数据

  • 城市空气质量AQI信息

  • 全国油价信息

  • 北京时间等。

JSON的构建:

  • 简单的键值对

  • JSON对象作为键的值

  • JSON数组

  • JSON数组的嵌套

JSON的构建

cJSON是一个基于C语言的JSON解析库,这个库非常简单,只有 cJSON.c和 cJSON.h两个文件,支持JSON的解析和构建,需要调用时,只需要 #include"cJSON.h"就可以使用了。

由于JSON的解析之前已经介绍过了:使用cJSON库解析JSON,所以本篇博文主要介绍使用cJSON来构建JSON,强大的cJSON库在构建JSON上也是非常的简单。

1.一个简单的JSON键值对构建

构建函数:

  1. void Create_Simple_JSON(void)

  2. {

  3. cJSON *root;

  4. root = cJSON_CreateObject();//创建一个json对象

  5. cJSON_AddItemToObject(root, "CSDN", cJSON_CreateString("https://blog.csdn.net/whik1194"));

  6. cJSON_AddItemToObject(root, "cnblogs", cJSON_CreateString("https://home.cnblogs.com/u/whik/"));

  7. cJSON_AddItemToObject(root, "Github", cJSON_CreateString("https://github.com/whik/"));

  8. cJSON_AddStringToObject(root, "Blog", "http://www.wangchaochao.top/");


  9. printf("构建的JSON:\n%s\n", cJSON_Print(root));

  10. cJSON_Delete(root);

  11. }

输出结果:

  1. {

  2. "CSDN": "https://blog.csdn.net/whik1194",

  3. "cnblogs": "https://home.cnblogs.com/u/whik/",

  4. "Github": "https://github.com/whik/",

  5. "Blog": "http://www.wangchaochao.top/"

  6. }

2.键的值是一个JSON对象

构建函数:

  1. void Create_BJTime_JSON(void)

  2. {


  3. cJSON *root;

  4. cJSON *result;


  5. root = cJSON_CreateObject();//创建一个json对象


  6. result = cJSON_CreateObject();

  7. //result构建


  8. cJSON_AddItemToObject(result, "timestamp", cJSON_CreateString("ok"));

  9. //等效于下面

  10. // cJSON_AddStringToObject(result, "timestamp", "ok");


  11. cJSON_AddItemToObject(result, "datetime_1", cJSON_CreateString("2019-07-21 10:46:57"));

  12. cJSON_AddItemToObject(result, "datetime_2", cJSON_CreateString("2019年07月21日 10时46分57秒"));

  13. cJSON_AddItemToObject(result, "week_1", cJSON_CreateString("0"));

  14. cJSON_AddItemToObject(result, "week_2", cJSON_CreateString("星期日"));

  15. cJSON_AddItemToObject(result, "week_3", cJSON_CreateString("周日"));

  16. cJSON_AddItemToObject(result, "week_4", cJSON_CreateString("Sunday"));


  17. //等效于cJSON_AddNumberToObject(root, "ok", 1);


  18. cJSON_AddItemToObject(root, "status", cJSON_CreateString("success"));

  19. cJSON_AddItemToObject(root, "result", result);

  20. cJSON_AddStringToObject(root, "Blog", "www.wangchaochao.top");


  21. printf("构建的JSON:\n%s\n", cJSON_Print(root));

  22. cJSON_Delete(root);

  23. }

输出结果:

  1. {

  2. "status": "success",

  3. "result": {

  4. "timestamp": "ok",

  5. "datetime_1": "2019-07-21 10:46:57",

  6. "datetime_2": "2019年07月21日 10时46分57秒",

  7. "week_1": "0",

  8. "week_2": "星期日",

  9. "week_3": "周日",

  10. "week_4": "Sunday"

  11. },

  12. "Blog": "www.wangchaochao.top"

  13. }

3.JSON数组,元素是字符串

构建函数:

  1. void Create_Array_Str_JSON(void)

  2. {

  3. cJSON *root;

  4. const char *strings[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};


  5. root=cJSON_CreateStringArray(strings,7);


  6. printf("%s\n",cJSON_Print(root));

  7. cJSON_Delete(root);

  8. }

输出结果:

  1. ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]

4.键的值是一个数组,数组包含多个对象元素

构建函数:

  1. void Create_Array_JSON(void)

  2. {

  3. cJSON *root;

  4. cJSON *forceast;

  5. cJSON *day1, *day2, *day3; //数组


  6. day1 = cJSON_CreateObject();

  7. day2 = cJSON_CreateObject();

  8. day3 = cJSON_CreateObject();


  9. cJSON_AddStringToObject(day1, "date", "2019-07-21"); //日期

  10. cJSON_AddStringToObject(day1, "cond_txt", "多云"); //天气状况

  11. cJSON_AddStringToObject(day1, "cond_code", "101"); //天气代码

  12. cJSON_AddStringToObject(day1, "hum", "23"); //湿度

  13. cJSON_AddStringToObject(day1, "tmp_H", "31"); //最高温度

  14. cJSON_AddStringToObject(day1, "tmp_L", "25"); //最低温度


  15. cJSON_AddStringToObject(day2, "date", "2019-07-22");

  16. cJSON_AddStringToObject(day2, "cond_txt", "晴");

  17. cJSON_AddStringToObject(day2, "cond_code", "100");

  18. cJSON_AddStringToObject(day2, "hum", "20");

  19. cJSON_AddStringToObject(day2, "tmp_H", "33");

  20. cJSON_AddStringToObject(day2, "tmp_L", "26");


  21. cJSON_AddStringToObject(day3, "date", "2019-07-23");

  22. cJSON_AddStringToObject(day3, "cond_txt", "阵雨");

  23. cJSON_AddStringToObject(day3, "cond_code", "107");

  24. cJSON_AddStringToObject(day3, "hum", "45");

  25. cJSON_AddStringToObject(day3, "tmp_H", "32");

  26. cJSON_AddStringToObject(day3, "tmp_L", "25");


  27. forceast = cJSON_CreateArray();

  28. //注意顺序,索引依次递增

  29. cJSON_AddItemToArray(forceast, day1); //元素0

  30. cJSON_AddItemToArray(forceast, day2); //元素1

  31. cJSON_AddItemToArray(forceast, day3); //元素2


  32. root = cJSON_CreateObject(); //创建一个json对象


  33. cJSON_AddStringToObject(root, "status", "ok");

  34. cJSON_AddItemToObject(root, "weather", forceast);

  35. cJSON_AddStringToObject(root, "update", "2019-07-21 11:00");

  36. cJSON_AddStringToObject(root, "Blog", "www.wangchaochao.top");

  37. //等效于:cJSON_AddItemToObject(root, "update", cJSON_CreateString("2019-07-21 11:00");


  38. printf("构建的JSON:\n%s\n", cJSON_Print(root));

  39. cJSON_Delete(root);

  40. }

输出结果:

  1. {

  2. "status": "ok",

  3. "weather": [{

  4. "date": "2019-07-21",

  5. "cond_txt": "多云",

  6. "cond_code": "101",

  7. "hum": "23",

  8. "tmp_H": "31",

  9. "tmp_L": "25"

  10. }, {

  11. "date": "2019-07-22",

  12. "cond_txt": "晴",

  13. "cond_code": "100",

  14. "hum": "20",

  15. "tmp_H": "33",

  16. "tmp_L": "26"

  17. }, {

  18. "date": "2019-07-23",

  19. "cond_txt": "阵雨",

  20. "cond_code": "107",

  21. "hum": "45",

  22. "tmp_H": "32",

  23. "tmp_L": "25"

  24. }],

  25. "update": "2019-07-21 11:00",

  26. "Blog": "www.wangchaochao.top"

  27. }

5.数组内嵌套了5个数组,每个数组内有5个字符串元素

构建函数:

  1. void Create_Array_Nest_JSON(void)

  2. {

  3. struct oil_stu{

  4. char *city; //城市名称

  5. char *oil_92_price; //92号汽油价格

  6. char *oil_95_price;

  7. char *oil_98_price;

  8. char *oil_0_price;

  9. };


  10. cJSON *root;

  11. cJSON *data; //包含多个数组

  12. cJSON *table, *data_bj, *data_sh, *data_js, *data_tj;


  13. const char *bj_str[5] = {"北京", "6.78", "7.21", "8.19", "6.45"};

  14. const char *sh_str[5] = {"上海", "6.74", "7.17", "7.87", "6.39"};

  15. const char *js_str[5] = {"江苏", "6.75", "7.18", "8.06", "6.37"};

  16. const char *tj_str[5] = {"天津", "6.77", "7.15", "8.07", "6.41"};

  17. const char *talbe_str[5] = {"地区", "92号汽油", "95号汽油", "98号汽油", "0号柴油"};


  18. data_bj = cJSON_CreateStringArray(bj_str, 5); //只包含5个字符串的数组

  19. data_sh = cJSON_CreateStringArray(sh_str, 5);

  20. data_js = cJSON_CreateStringArray(js_str, 5);

  21. data_tj = cJSON_CreateStringArray(tj_str, 5);

  22. table = cJSON_CreateStringArray(talbe_str, 5);


  23. data = cJSON_CreateArray();

  24. cJSON_AddItemToArray(data, table);

  25. cJSON_AddItemToArray(data, data_bj);

  26. cJSON_AddItemToArray(data, data_sh);

  27. cJSON_AddItemToArray(data, data_js);

  28. cJSON_AddItemToArray(data, data_tj);


  29. root = cJSON_CreateObject();


  30. cJSON_AddStringToObject(root, "status", "ok");

  31. cJSON_AddStringToObject(root, "msg", "2019-07-21 11:00");

  32. cJSON_AddStringToObject(root, "update", "2019-07-21 11:00");

  33. cJSON_AddItemToObject(root, "data", data);

  34. cJSON_AddStringToObject(root, "About", "wcc");

  35. cJSON_AddStringToObject(root, "Blog", "www.wangchaochao.top");


  36. printf("构建的JSON:\n%s\n", cJSON_Print(root));

  37. cJSON_Delete(root);

  38. }

输出结果:

  1. {

  2. "status": "ok",

  3. "msg": "全国各省份汽柴油价格信息",

  4. "update": "2019-07-21",

  5. "data": [

  6. ["地区", "92号汽油", "95号汽油", "98号汽油", "0号柴油"],

  7. ["北京", "6.78", "7.21", "8.19", "6.45"],

  8. ["上海", "6.74", "7.17", "7.87", "6.39"],

  9. ["江苏", "6.75", "7.18", "8.06", "6.37"],

  10. ["天津", "6.77", "7.15", "8.07", "6.41"]

  11. ],

  12. "About": "wcc",

  13. "Blog": "www.wangchaochao.top"

  14. }

分享几个免费的API提供平台

  • K780:

    http://www.k780.com/api

  • 天气API:

    http://api.help.bj.cn/api/

  • 心知天气:

    https://www.seniverse.com/

  • 和风天气:

    http://www.heweather.com

  • 聚合数据:

    https://www.juhe.cn/

参考资料

  • cJSON库源码:

    https://sourceforge.net/projects/cjson/

  • JSON官方网站:

    http://www.json.org/json-zh.html

历史精选


欢迎关注我的个人博客:

www.wangchaochao.top

或微信扫码关注我的公众号


由于微信文章不支持超链接,文中出现的软件、程序等文件下载,可以点击"阅读原文",跳转到我的博客文章进行下载。



原创不易,如果觉得我的文章对你有所帮助,可以随手点“好看”分享,你的支持将是我持续更新的动力。

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存