使用cJSON库解析JSON

栏目: C · 发布时间: 7年前

内容简介:cJSON是一个基于C的JSON解析库,这个库非常简单,只有cJSON.c和cJSON.h两个文件,支持JSON的解析和封装,需要调用时,只需要JSON字符串:

cJSON库的下载

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

只包含键值对的JSON字符串解析

JSON字符串:

{
	"name": "Andy",      //键值对1
	"age": 20              //键值对2
}

使用cJSON库解析JSON

这个JSON对象只有两个键值对,键name对应字符串Andy,键age对应数字20。

void Parse_Str1(void)
{
    char str1[] = "{\"name\":\"Andy\",\"age\":20}";
    cJSON *str1_json, *str1_name, *str1_age;
    printf("str1:%s\n\n",str1);
    str1_json = cJSON_Parse(str1);   //创建JSON解析对象,返回JSON格式是否正确
    if (!str1_json)
    {
        printf("JSON格式错误:%s\n\n", cJSON_GetErrorPtr()); //输出json格式错误信息
    }
    else
    {
        printf("JSON格式正确:\n%s\n\n",cJSON_Print(str1_json) );
        str1_name = cJSON_GetObjectItem(str1_json, "name"); //获取name键对应的值的信息
        if (str1_name->type == cJSON_String)
        {
            printf("姓名:%s\r\n", str1_name->valuestring);
        }
        str1_age = cJSON_GetObjectItem(str1_json, "age");   //获取age键对应的值的信息
        if(str1_age->type==cJSON_Number)
        {
            printf("年龄:%d\r\n", str1_age->valueint);
        }
        cJSON_Delete(str1_json);//释放内存
    }
}

运行结果:

使用cJSON库解析JSON

包含数组的JSON字符串解析

JSON字符串:

{
	"location": [{
			"name": "Faye",
			"address": "北京"
		},
		{
			"name": "Andy",
			"address": "香港"
		}
	],
	"time": "2018-11-17"
}

使用cJSON库解析JSON

解析函数:

void Parse_Str2(void)
{

    char str2[] = "{\"location\":[{\"name\":\"Faye\",\"address\":\"北京\"},{\"name\":\"Andy\",\"address\":\"香港\"}],\"time\":\"2018-11-17\"}";

    cJSON *root = 0;
    cJSON *loc_json = 0;
    cJSON *name1_json,*name2_json;
    char *time_str, *str_tmp;

    root = cJSON_Parse(str2);
    if(!root)
        printf("str2 JSON格式错误:%s \r\n", cJSON_GetErrorPtr());
    else
    {
        printf("str2 JSON格式正确:\n%s\n",cJSON_Print(root));
        time_str = cJSON_GetObjectItem(root,"time")->valuestring;//time键值对
        printf("time:%s\n", time_str);

        loc_json = cJSON_GetObjectItem(root,"location");
        if(loc_json)
        {
            name1_json = cJSON_GetArrayItem(loc_json,0);        //数组第0个元素
            str_tmp = cJSON_GetObjectItem(name1_json, "name")->valuestring;//name键对应的值
            printf("name1 is : %s \r\n", str_tmp);
            str_tmp = cJSON_GetObjectItem(name1_json, "address")->valuestring;//addr1键对应的值
            printf("addr1 is : %s \r\n", str_tmp);

            name2_json = cJSON_GetArrayItem(loc_json,1);       //数组第1个元素
            str_tmp = cJSON_GetObjectItem(name2_json, "name")->valuestring;
            printf("name2 is : %s \r\n", str_tmp);
            str_tmp = cJSON_GetObjectItem(name2_json, "address")->valuestring;
            printf("addr2 is : %s \r\n", str_tmp);
        }
    }
    cJSON_Delete(loc_json);
}

运行结果:

使用cJSON库解析JSON

北京时间JSON数据解析

api地址:

http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json

JSON字符串:

{
	"success": "1",
	"result": {
		"timestamp": "1543922613",
		"datetime_1": "2018-12-04 19:23:33",
		"datetime_2": "2018年12月04日 19时23分33秒",
		"week_1": "2",
		"week_2": "星期二",
		"week_3": "周二",
		"week_4": "Tuesday"
	}
}

解析函数:

void Parse_BJ_Time(void)
{
    char bj_time_str[] = "{\"success\":\"1\",\"result\":{\"timestamp\":\"1542456793\",\"datetime_1\":\"2018-11-17 20:13:13\",\"datetime_2\":\"2018年11月17日 20时13分13秒\",\"week_1\":\"6\",\"week_2\":\"星期六\",\"week_3\":\"周六\",\"week_4\":\"Saturday\"}}";

    cJSON *root;
    cJSON *result_json;
    char *datetime, *week;

    root = cJSON_Parse(bj_time_str);
    if(root)
    {
        printf("json格式正确:\n%s\n\n", cJSON_Print(root));
        result_json =  cJSON_GetObjectItem(root, "result");  //获取result键对应的值
        if(result_json)
        {
            datetime = cJSON_GetObjectItem(result_json, "datetime_2")->valuestring;
            printf("北京时间: %s \r\n", datetime);
            week = cJSON_GetObjectItem(result_json, "week_2")->valuestring;
            printf("星期: %s \r\n", week);
        }
    }
    cJSON_Delete(root);
    cJSON_Delete(result_json);
}

运行结果:

使用cJSON库解析JSON

心知天气JSON数据解析

JSON字符串:

{
	"results": [{
		"location": {
			"id": "WS10730EM8EV",
			"name": "深圳",
			"country": "CN",
			"path": "深圳,深圳,广东,中国",
			"timezone": "Asia/Shanghai",
			"timezone_offset": "+08:00"
		},
		"daily": [{
			"date": "2018-11-18",
			"text_day": "多云",
			"code_day": "4",
			"text_night": "多云",
			"code_night": "4",
			"high": "26",
			"low": "20",
			"precip": "",
			"wind_direction": "无持续风向",
			"wind_direction_degree": "",
			"wind_speed": "10",
			"wind_scale": "2"
		}, {
			"date": "2018-11-19",
			"text_day": "小雨",
			"code_day": "13",
			"text_night": "小雨",
			"code_night": "13",
			"high": "25",
			"low": "20",
			"precip": "",
			"wind_direction": "无持续风向",
			"wind_direction_degree": "",
			"wind_speed": "10",
			"wind_scale": "2"
		}, {
			"date": "2018-11-20",
			"text_day": "小雨",
			"code_day": "13",
			"text_night": "小雨",
			"code_night": "13",
			"high": "25",
			"low": "21",
			"precip": "",
			"wind_direction": "无持续风向",
			"wind_direction_degree": "",
			"wind_speed": "10",
			"wind_scale": "2"
		}],
		"last_update": "2018-11-18T11:00:00+08:00"
	}]
}

解析函数:

void parse_seniverse_weather(void)
{
    char weather_str[] =
        "{\"results\":[{\"location\":{\"id\":\"WS10730EM8EV\",\"name\":\"深圳\",\"country\":\"CN\",\"path\":\"深圳,深圳,广东,中国\",\"timezone\":\"Asia/Shanghai\",\"timezone_offset\":\"+08:00\"},\"daily\":[{\"date\":\"2018-11-18\",\"text_day\":\"多云\",\"code_day\":\"4\",\"text_night\":\"多云\",\"code_night\":\"4\",\"high\":\"26\",\"low\":\"20\",\"precip\":\"\",\"wind_direction\":\"无持续风向\",\"wind_direction_degree\":\"\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"},{\"date\":\"2018-11-19\",\"text_day\":\"小雨\",\"code_day\":\"13\",\"text_night\":\"小雨\",\"code_night\":\"13\",\"high\":\"25\",\"low\":\"20\",\"precip\":\"\",\"wind_direction\":\"无持续风向\",\"wind_direction_degree\":\"\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"},{\"date\":\"2018-11-20\",\"text_day\":\"小雨\",\"code_day\":\"13\",\"text_night\":\"小雨\",\"code_night\":\"13\",\"high\":\"25\",\"low\":\"21\",\"precip\":\"\",\"wind_direction\":\"无持续风向\",\"wind_direction_degree\":\"\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"}],\"last_update\":\"2018-11-18T11:00:00+08:00\"}]}";
    cJSON *root;
    cJSON *results;
    cJSON *last_update;
    cJSON *loc_json, *daily_json;
    cJSON *forecast_json;
    char *loc_tmp, *weather_tmp, *update_tmp;
    int i = 0;

    root = cJSON_Parse((const char*)weather_str);
    if(root)
    {
//        printf("JSON格式正确:\n%s\n\n",cJSON_Print(root));    //输出json字符串
        results = cJSON_GetObjectItem(root, "results");
        results = cJSON_GetArrayItem(results,0);
        if(results)
        {
            loc_json = cJSON_GetObjectItem(results, "location");   //得到location键对应的值,是一个对象

            loc_tmp = cJSON_GetObjectItem(loc_json, "id") -> valuestring;
            printf("城市ID:%s\n",loc_tmp);
            loc_tmp = cJSON_GetObjectItem(loc_json, "name") -> valuestring;
            printf("城市名称:%s\n",loc_tmp);
            loc_tmp = cJSON_GetObjectItem(loc_json, "timezone") -> valuestring;
            printf("城市时区:%s\n\n",loc_tmp);

            daily_json = cJSON_GetObjectItem(results, "daily");
            if(daily_json)
            {
                for(i = 0; i < 3; i++)
                {
                    forecast_json = cJSON_GetArrayItem(daily_json, i);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "date") -> valuestring;
                    printf("日期:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "code_day") -> valuestring;
                    printf("白天天气代码:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "code_night") -> valuestring;
                    printf("晚上天气代码:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "high") -> valuestring;
                    printf("最高温度:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "low") -> valuestring;
                    printf("最低温度:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_direction_degree") -> valuestring;
                    printf("风向角度:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_scale") -> valuestring;
                    printf("风力:%s\r\n\n", weather_tmp);
                }
            }
            else
                printf("daily json格式错误\r\n");
            last_update = cJSON_GetObjectItem(results, "last_update");
            update_tmp = last_update->valuestring;
            if(last_update)
            {
                printf("更新时间:%s\r\n", update_tmp);
            }
        }
        else
        {
            printf("results格式错误:%s\r\n", cJSON_GetErrorPtr());
        }
    }
    else
    {
        printf("JSON格式错误\r\n");
    }
    cJSON_Delete(root);
    cJSON_Delete(results);
}

运行结果:

使用cJSON库解析JSON

和风天气数据解析

JSON字符串:

{
	"HeWeather6": [{
		"basic": {
			"cid": "CN101010700",
			"location": "昌平",
			"parent_city": "北京",
			"admin_area": "北京",
			"cnty": "中国",
			"lat": "40.21808624",
			"lon": "116.23590851",
			"tz": "+8.00"
		},
		"update": {
			"loc": "2018-11-21 21:45",
			"utc": "2018-11-21 13:45"
		},
		"status": "ok",
		"daily_forecast": [{
			"cond_code_d": "100",
			"cond_code_n": "100",
			"cond_txt_d": "晴",
			"cond_txt_n": "晴",
			"date": "2018-11-21",
			"hum": "21",
			"mr": "16:02",
			"ms": "04:27",
			"pcpn": "0.0",
			"pop": "0",
			"pres": "1030",
			"sr": "07:08",
			"ss": "16:53",
			"tmp_max": "9",
			"tmp_min": "-3",
			"uv_index": "5",
			"vis": "10",
			"wind_deg": "323",
			"wind_dir": "西北风",
			"wind_sc": "1-2",
			"wind_spd": "4"
		}, {
			"cond_code_d": "100",
			"cond_code_n": "101",
			"cond_txt_d": "晴",
			"cond_txt_n": "多云",
			"date": "2018-11-22",
			"hum": "21",
			"mr": "16:36",
			"ms": "05:33",
			"pcpn": "0.0",
			"pop": "0",
			"pres": "1030",
			"sr": "07:09",
			"ss": "16:52",
			"tmp_max": "8",
			"tmp_min": "-4",
			"uv_index": "3",
			"vis": "20",
			"wind_deg": "35",
			"wind_dir": "东北风",
			"wind_sc": "1-2",
			"wind_spd": "5"
		}, {
			"cond_code_d": "101",
			"cond_code_n": "100",
			"cond_txt_d": "多云",
			"cond_txt_n": "晴",
			"date": "2018-11-23",
			"hum": "23",
			"mr": "17:15",
			"ms": "06:41",
			"pcpn": "0.0",
			"pop": "16",
			"pres": "1024",
			"sr": "07:10",
			"ss": "16:52",
			"tmp_max": "7",
			"tmp_min": "-2",
			"uv_index": "2",
			"vis": "20",
			"wind_deg": "305",
			"wind_dir": "西北风",
			"wind_sc": "1-2",
			"wind_spd": "3"
		}]
	}]
}

解析函数:

//解析和风天气,格式和心知天气非常像
void parse_heweather(void)
{
    char heweather_str[] = "{\"HeWeather6\":[{\"basic\":{\"cid\":\"CN101010700\",\"location\":\"昌平\",\"parent_city\":\"北京\",\"admin_area\":\"北京\",\"cnty\":\"中国\",\"lat\":\"40.21808624\",\"lon\":\"116.23590851\",\"tz\":\"+8.00\"},\"update\":{\"loc\":\"2018-11-21 21:45\",\"utc\":\"2018-11-21 13:45\"},\"status\":\"ok\",\"daily_forecast\":[{\"cond_code_d\":\"100\",\"cond_code_n\":\"100\",\"cond_txt_d\":\"晴\",\"cond_txt_n\":\"晴\",\"date\":\"2018-11-21\",\"hum\":\"21\",\"mr\":\"16:02\",\"ms\":\"04:27\",\"pcpn\":\"0.0\",\"pop\":\"0\",\"pres\":\"1030\",\"sr\":\"07:08\",\"ss\":\"16:53\",\"tmp_max\":\"9\",\"tmp_min\":\"-3\",\"uv_index\":\"5\",\"vis\":\"10\",\"wind_deg\":\"323\",\"wind_dir\":\"西北风\",\"wind_sc\":\"1-2\",\"wind_spd\":\"4\"},{\"cond_code_d\":\"100\",\"cond_code_n\":\"101\",\"cond_txt_d\":\"晴\",\"cond_txt_n\":\"多云\",\"date\":\"2018-11-22\",\"hum\":\"21\",\"mr\":\"16:36\",\"ms\":\"05:33\",\"pcpn\":\"0.0\",\"pop\":\"0\",\"pres\":\"1030\",\"sr\":\"07:09\",\"ss\":\"16:52\",\"tmp_max\":\"8\",\"tmp_min\":\"-4\",\"uv_index\":\"3\",\"vis\":\"20\",\"wind_deg\":\"35\",\"wind_dir\":\"东北风\",\"wind_sc\":\"1-2\",\"wind_spd\":\"5\"},{\"cond_code_d\":\"101\",\"cond_code_n\":\"100\",\"cond_txt_d\":\"多云\",\"cond_txt_n\":\"晴\",\"date\":\"2018-11-23\",\"hum\":\"23\",\"mr\":\"17:15\",\"ms\":\"06:41\",\"pcpn\":\"0.0\",\"pop\":\"16\",\"pres\":\"1024\",\"sr\":\"07:10\",\"ss\":\"16:52\",\"tmp_max\":\"7\",\"tmp_min\":\"-2\",\"uv_index\":\"2\",\"vis\":\"20\",\"wind_deg\":\"305\",\"wind_dir\":\"西北风\",\"wind_sc\":\"1-2\",\"wind_spd\":\"3\"}]}]}";

    cJSON *root;
    cJSON *results;
    cJSON *basic_json, *update_json, *forecast_json;
    cJSON *daily_json;

    int i = 0;
    char *basic_tmp, *update_tmp, *status_tmp, *weather_tmp;
    root = cJSON_Parse(heweather_str);
    if(root)
    {
        results = cJSON_GetObjectItem(root, "HeWeather6");      //HeWeather键对应的值,是一个数组
        results = cJSON_GetArrayItem(results,0);
        if(results)
        {
            basic_json = cJSON_GetObjectItem(results, "basic");
            if(basic_json)
            {
                basic_tmp = cJSON_GetObjectItem(basic_json, "cid") -> valuestring;
                printf("城市ID:%s\n",basic_tmp);
                basic_tmp = cJSON_GetObjectItem(basic_json, "location") -> valuestring;
                printf("县级市:%s\n",basic_tmp);
                basic_tmp = cJSON_GetObjectItem(basic_json, "parent_city") -> valuestring;
                printf("地级市:%s\n",basic_tmp);
                basic_tmp = cJSON_GetObjectItem(basic_json, "admin_area") -> valuestring;
                printf("所属省:%s\n",basic_tmp);
                basic_tmp = cJSON_GetObjectItem(basic_json, "lat") -> valuestring;
                printf("纬度:%s\n",basic_tmp);
                basic_tmp = cJSON_GetObjectItem(basic_json, "lon") -> valuestring;
                printf("经度:%s\n\n",basic_tmp);
            }
            update_json = cJSON_GetObjectItem(results, "update");
            if(update_json)
            {
                update_tmp = cJSON_GetObjectItem(update_json, "loc") -> valuestring;
                printf("更新时间:%s(所在地时间)\n", update_tmp);
                update_tmp = cJSON_GetObjectItem(update_json, "utc") -> valuestring;
                printf("更新时间:%s(世界时间)\n\n", update_tmp);
            }
            status_tmp = cJSON_GetObjectItem(results, "status") -> valuestring;
            printf("解析状态:%s\n\n", status_tmp);
            daily_json = cJSON_GetObjectItem(results, "daily_forecast");
            if(daily_json)
            {
                for(i = 0; i < 3; i++)
                {
                    forecast_json = cJSON_GetArrayItem(daily_json, i);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "date") -> valuestring;
                    printf("日期:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "cond_txt_d") -> valuestring;
                    printf("白天天气:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "cond_txt_n") -> valuestring;
                    printf("晚上天气:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "tmp_max") -> valuestring;
                    printf("最高温度:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "tmp_min") -> valuestring;
                    printf("最低温度:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_deg") -> valuestring;
                    printf("风向角度:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_dir") -> valuestring;
                    printf("风向:%s\r\n", weather_tmp);
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_sc") -> valuestring;
                    printf("风力:%s\r\n\n", weather_tmp);
                }
            }
        }
    }
    cJSON_Delete(root);
    cJSON_Delete(results);
    cJSON_Delete(basic_json);
    cJSON_Delete(update_json);
    cJSON_Delete(forecast_json);
    cJSON_Delete(daily_json);
}

运行结果:

使用cJSON库解析JSON

源码下载及实用的API地址:

  • 本项目CodeBlock工程源码下载: MyJSON

  • 在线JSON格式校验工具: bejson

  • 免费的天气api接口: 天气API


以上所述就是小编给大家介绍的《使用cJSON库解析JSON》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Powerful

Powerful

Patty McCord / Missionday / 2018-1-25

Named by The Washington Post as one of the 11 Leadership Books to Read in 2018 When it comes to recruiting, motivating, and creating great teams, Patty McCord says most companies have it all wrong. Mc......一起来看看 《Powerful》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试