使用cJSON庫解析和構建JSON字符串


使用cJSON庫解析和構建JSON字符串

前言

其實之前的兩篇博文已經介紹了json格式和如何使用cJSON庫來解析JSON:

當時在MCU平台上使用時,會出現時間長了死機的情況,在調用cJSON_Print輸出格式化后的JSON數據之后,

    LOG("JSON數據:\n%s\n", cJSON_Print(root));	

要使用cJSON_Delete釋放內存,否則會導致內存泄漏。

cJSON_Delete(root);     //調用cJSON_Print時才需要

這一點在嵌入式開發平台要格外注意。

解析和構建JSON的示例程序,我都已經上傳到代碼托管平台上,示例工程基於CodeBlocks開發環境。

Github倉庫地址:

Gitee倉庫地址:

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

Github:

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

Gitee:

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

JSON解析示例包括:

  • 和風天氣實時數據
  • 心知天氣實時數據
  • 心知天氣3天預報數據
  • 城市空氣質量AQI信息
  • 全國油價信息
  • 北京時間等。

JSON的構建:

  • 簡單的鍵值對
  • JSON對象作為鍵的值
  • JSON數組
  • JSON數組的嵌套

JSON的構建

cJSON是一個基於C語言的JSON解析庫,這個庫非常簡單,只有cJSON.ccJSON.h兩個文件,支持JSON的解析和構建,需要調用時,只需要#include "cJSON.h"就可以使用了。

由於JSON的解析之前已經介紹過了:使用cJSON庫解析JSON,所以本篇博文主要介紹使用cJSON來構建JSON,強大的cJSON庫在構建JSON上也是非常的簡單。

1.一個簡單的JSON鍵值對構建

構建函數:

void Create_Simple_JSON(void)
{
    cJSON *root;
    root = cJSON_CreateObject();//創建一個json對象
    cJSON_AddItemToObject(root, "CSDN", cJSON_CreateString("https://blog.csdn.net/whik1194"));
    cJSON_AddItemToObject(root, "cnblogs", cJSON_CreateString("https://home.cnblogs.com/u/whik/"));
    cJSON_AddItemToObject(root, "Github", cJSON_CreateString("https://github.com/whik/"));
    cJSON_AddStringToObject(root, "Blog", "http://www.wangchaochao.top/");

    printf("構建的JSON:\n%s\n", cJSON_Print(root));
    cJSON_Delete(root);
}

輸出結果:

{
    "CSDN": "https://blog.csdn.net/whik1194",
    "cnblogs": "https://home.cnblogs.com/u/whik/",
    "Github": "https://github.com/whik/",
    "Blog": "http://www.wangchaochao.top/"
}

2.鍵的值是一個JSON對象

構建函數:

void Create_BJTime_JSON(void)
{

    cJSON *root;
    cJSON *result;

    root = cJSON_CreateObject();//創建一個json對象

    result = cJSON_CreateObject();
    //result構建

    cJSON_AddItemToObject(result, "timestamp", cJSON_CreateString("ok"));
//等效於下面
//    cJSON_AddStringToObject(result, "timestamp", "ok");

    cJSON_AddItemToObject(result, "datetime_1", cJSON_CreateString("2019-07-21 10:46:57"));
    cJSON_AddItemToObject(result, "datetime_2", cJSON_CreateString("2019年07月21日 10時46分57秒"));
    cJSON_AddItemToObject(result, "week_1", cJSON_CreateString("0"));
    cJSON_AddItemToObject(result, "week_2", cJSON_CreateString("星期日"));
    cJSON_AddItemToObject(result, "week_3", cJSON_CreateString("周日"));
    cJSON_AddItemToObject(result, "week_4", cJSON_CreateString("Sunday"));

    //等效於cJSON_AddNumberToObject(root, "ok", 1);

    cJSON_AddItemToObject(root, "status", cJSON_CreateString("success"));
    cJSON_AddItemToObject(root, "result", result);
    cJSON_AddStringToObject(root, "Blog", "www.wangchaochao.top");

    printf("構建的JSON:\n%s\n", cJSON_Print(root));
    cJSON_Delete(root);
}

輸出結果:

{
	"status": "success",
	"result": {
		"timestamp": "ok",
		"datetime_1": "2019-07-21 10:46:57",
		"datetime_2": "2019年07月21日 10時46分57秒",
		"week_1": "0",
		"week_2": "星期日",
		"week_3": "周日",
		"week_4": "Sunday"
	},
	"Blog": "www.wangchaochao.top"
}

3.JSON數組,元素是字符串

構建函數:

void Create_Array_Str_JSON(void)
{
    cJSON *root;
    const char *strings[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

	root=cJSON_CreateStringArray(strings,7);

	printf("%s\n",cJSON_Print(root));
	cJSON_Delete(root);
}

輸出結果:

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

4.鍵的值是一個數組,數組包含多個對象元素

構建函數:

void Create_Array_JSON(void)
{
    cJSON *root;
    cJSON *forceast;
    cJSON *day1, *day2, *day3;  //數組

    day1 = cJSON_CreateObject();
    day2 = cJSON_CreateObject();
    day3 = cJSON_CreateObject();

    cJSON_AddStringToObject(day1, "date", "2019-07-21");    //日期
    cJSON_AddStringToObject(day1, "cond_txt", "多雲");      //天氣狀況
    cJSON_AddStringToObject(day1, "cond_code", "101");      //天氣代碼
    cJSON_AddStringToObject(day1, "hum", "23");             //濕度
    cJSON_AddStringToObject(day1, "tmp_H", "31");           //最高溫度
    cJSON_AddStringToObject(day1, "tmp_L", "25");           //最低溫度

    cJSON_AddStringToObject(day2, "date", "2019-07-22");
    cJSON_AddStringToObject(day2, "cond_txt", "晴");
    cJSON_AddStringToObject(day2, "cond_code", "100");
    cJSON_AddStringToObject(day2, "hum", "20");
    cJSON_AddStringToObject(day2, "tmp_H", "33");
    cJSON_AddStringToObject(day2, "tmp_L", "26");

    cJSON_AddStringToObject(day3, "date", "2019-07-23");
    cJSON_AddStringToObject(day3, "cond_txt", "陣雨");
    cJSON_AddStringToObject(day3, "cond_code", "107");
    cJSON_AddStringToObject(day3, "hum", "45");
    cJSON_AddStringToObject(day3, "tmp_H", "32");
    cJSON_AddStringToObject(day3, "tmp_L", "25");

    forceast = cJSON_CreateArray();
    //注意順序,索引依次遞增
    cJSON_AddItemToArray(forceast, day1);   //元素0
    cJSON_AddItemToArray(forceast, day2);   //元素1
    cJSON_AddItemToArray(forceast, day3);   //元素2

    root = cJSON_CreateObject();    //創建一個json對象

    cJSON_AddStringToObject(root, "status", "ok");
    cJSON_AddItemToObject(root, "weather", forceast);
    cJSON_AddStringToObject(root, "update", "2019-07-21 11:00");
    cJSON_AddStringToObject(root, "Blog", "www.wangchaochao.top");
   //等效於:cJSON_AddItemToObject(root, "update", cJSON_CreateString("2019-07-21 11:00");

    printf("構建的JSON:\n%s\n", cJSON_Print(root));
    cJSON_Delete(root);
}

輸出結果:

{
	"status": "ok",
	"weather": [{
		"date": "2019-07-21",
		"cond_txt": "多雲",
		"cond_code": "101",
		"hum": "23",
		"tmp_H": "31",
		"tmp_L": "25"
	}, {
		"date": "2019-07-22",
		"cond_txt": "晴",
		"cond_code": "100",
		"hum": "20",
		"tmp_H": "33",
		"tmp_L": "26"
	}, {
		"date": "2019-07-23",
		"cond_txt": "陣雨",
		"cond_code": "107",
		"hum": "45",
		"tmp_H": "32",
		"tmp_L": "25"
	}],
	"update": "2019-07-21 11:00",
	"Blog": "www.wangchaochao.top"
}

5.數組內嵌套了5個數組,每個數組內有5個字符串元素

構建函數:

void Create_Array_Nest_JSON(void)
{
    struct oil_stu{
        char *city;          //城市名稱
        char *oil_92_price;  //92號汽油價格
        char *oil_95_price;
        char *oil_98_price;
        char *oil_0_price;
    };

    cJSON *root;
    cJSON *data;  //包含多個數組
    cJSON *table, *data_bj, *data_sh, *data_js, *data_tj;

    const char *bj_str[5] = {"北京", "6.78", "7.21", "8.19", "6.45"};
    const char *sh_str[5] = {"上海", "6.74", "7.17", "7.87", "6.39"};
    const char *js_str[5] = {"江蘇", "6.75", "7.18", "8.06", "6.37"};
    const char *tj_str[5] = {"天津", "6.77", "7.15", "8.07", "6.41"};
    const char *talbe_str[5] = {"地區", "92號汽油", "95號汽油", "98號汽油", "0號柴油"};

    data_bj = cJSON_CreateStringArray(bj_str, 5);   //只包含5個字符串的數組
    data_sh = cJSON_CreateStringArray(sh_str, 5);
    data_js = cJSON_CreateStringArray(js_str, 5);
    data_tj = cJSON_CreateStringArray(tj_str, 5);
    table = cJSON_CreateStringArray(talbe_str, 5);

    data = cJSON_CreateArray();
    cJSON_AddItemToArray(data, table);
    cJSON_AddItemToArray(data, data_bj);
    cJSON_AddItemToArray(data, data_sh);
    cJSON_AddItemToArray(data, data_js);
    cJSON_AddItemToArray(data, data_tj);

    root = cJSON_CreateObject();

    cJSON_AddStringToObject(root, "status", "ok");
    cJSON_AddStringToObject(root, "msg", "2019-07-21 11:00");
    cJSON_AddStringToObject(root, "update", "2019-07-21 11:00");
    cJSON_AddItemToObject(root, "data", data);
    cJSON_AddStringToObject(root, "About", "wcc");
    cJSON_AddStringToObject(root, "Blog", "www.wangchaochao.top");

    printf("構建的JSON:\n%s\n", cJSON_Print(root));
    cJSON_Delete(root);
}

輸出結果:

{
	"status": "ok",
	"msg": "全國各省份汽柴油價格信息",
	"update": "2019-07-21",
	"data": [
		["地區", "92號汽油", "95號汽油", "98號汽油", "0號柴油"],
		["北京", "6.78", "7.21", "8.19", "6.45"],
		["上海", "6.74", "7.17", "7.87", "6.39"],
		["江蘇", "6.75", "7.18", "8.06", "6.37"],
		["天津", "6.77", "7.15", "8.07", "6.41"]
	],
	"About": "wcc",
	"Blog": "www.wangchaochao.top"
}

參考資料

歷史精選


歡迎關注我的個人博客:www.wangchaochao.top

或微信掃碼關注我的公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM