cJSON 入门与应用
1. cJSON简介
cJSON aims to be the dumbest possible parser that you can get your job done with. It's a single file of C, and a single header file.
JSON is described best here: http://www.json.org/ It's like XML, but fat-free. You use it to move data around, store things, or just generally represent your program's state.
cJSON 下载地址:https://github.com/DaveGamble/cJSON
2. cJSON常用函数简介
cJSON * cJSON_CreateObject();
创建一个json对象,返回一个cJSON结构体类型的指针。
cJSON *cJSON_CreateArray();
创建一个数组对象,返回一个cJSON结构体类型的指针。
cJSON *cJSON_CreateString(const char *string);
创建一个字符串对象,传入一个char *类型的字符串,返回一个cJSON结构体类型的指针。
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
向数组对象中添加一个元素,传入参数array为cJSON *结构体类型的指针,为数组对象; item为添加入数字对象中的对象指针。
void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
向json对象中添加一对元素,object为json对象,string为加入一对元素中的name,item为加入一对元素中的value。
cJSON *cJSON_Parse(const char *value);
解析一个json串,传入一个json格式的字符串,返回一个cJSON *类型的结构体指针。
char *cJSON_Print(cJSON *item);
将一个cJSON结构体代表的json对象转换为一个json格式的字符串。
void cJSON_Delete(cJSON *c);
释放一个cJSON对象所占用的内存空间。
3. 应用
以此json串为例进行json的生成和解析:
{ "name": "中国", "province": [{ "name": "黑龙江", "cities": { "city": ["哈尔滨", "大庆"] } }, { "name": "广东", "cities": { "city": ["广州", "深圳", "珠海"] } }, { "name": "*", "cities": { "city": ["台北", "*"] } }, { "name": "*", "cities": { "city": ["乌鲁木齐"] } }] }
3.1 生成json
#include <stdio.h> #include "cJSON.h" #include "cJSON_Utils.h" #pragma comment(lib,"cjson.lib") int main(void) { cJSON * json = cJSON_CreateObject(); cJSON *provinceArray = cJSON_CreateArray(); cJSON *heilongjiang = cJSON_CreateObject(); cJSON *hljcities = cJSON_CreateObject(); cJSON *hljcityArray = cJSON_CreateArray(); cJSON *guangdong = cJSON_CreateObject(); cJSON *gdcities = cJSON_CreateObject(); cJSON *gdcityArray = cJSON_CreateArray(); cJSON ** = cJSON_CreateObject(); cJSON *twcities = cJSON_CreateObject(); cJSON *twcityArray = cJSON_CreateArray(); cJSON ** = cJSON_CreateObject(); cJSON *xjcities = cJSON_CreateObject(); cJSON *xjcityArray = cJSON_CreateArray(); cJSON_AddStringToObject(json, "name", "中国"); cJSON_AddStringToObject(heilongjiang, "name", "黑龙江"); cJSON_AddItemToArray(hljcityArray, cJSON_CreateString("哈尔滨")); cJSON_AddItemToArray(hljcityArray, cJSON_CreateString("大庆")); cJSON_AddItemToObject(hljcities, "city", hljcityArray); cJSON_AddItemToObject(heilongjiang, "cities", hljcities); cJSON_AddStringToObject(guangdong, "name", "广东"); cJSON_AddItemToArray(gdcityArray, cJSON_CreateString("广州")); cJSON_AddItemToArray(gdcityArray, cJSON_CreateString("深圳")); cJSON_AddItemToArray(gdcityArray, cJSON_CreateString("珠海")); cJSON_AddItemToObject(gdcities, "city", gdcityArray); cJSON_AddItemToObject(guangdong, "cities", gdcities); cJSON_AddStringToObject(*, "name", "*"); cJSON_AddItemToArray(twcityArray, cJSON_CreateString("台北")); cJSON_AddItemToArray(twcityArray, cJSON_CreateString("*")); cJSON_AddItemToObject(twcities, "city", twcityArray); cJSON_AddItemToObject(*, "cities", twcities); cJSON_AddStringToObject(*, "name", "*"); cJSON_AddItemToArray(xjcityArray, cJSON_CreateString("乌鲁木齐")); cJSON_AddItemToObject(xjcities, "city", xjcityArray); cJSON_AddItemToObject(*, "cities", xjcities); cJSON_AddItemToArray(provinceArray, heilongjiang); cJSON_AddItemToArray(provinceArray, guangdong); cJSON_AddItemToArray(provinceArray, *); cJSON_AddItemToArray(provinceArray, *); cJSON_AddItemToObject(json, "province", provinceArray); printf("%s\n", cJSON_Print(json)); if ( NULL != json ) { cJSON_Delete(json); json = NULL; } return 0; }
3.2 解析json
#include <stdio.h> #include "cJSON.h" #include "cJSON_Utils.h" #pragma comment(lib,"cjson.lib") int main(void) { const char *jsonStr = "{ \ \"name\": \"中国\", \ \"province\": [{ \ \"name\": \"黑龙江\", \ \"cities\": { \ \"city\": [\"哈尔滨\", \"大庆\"] \ } \ }, { \ \"name\": \"广东\", \ \"cities\": { \ \"city\": [\"广州\", \"深圳\", \"珠海\"] \ } \ }, { \ \"name\": \"*\", \ \"cities\": { \ \"city\": [\"台北\", \"*\"] \ } \ }, { \ \"name\": \"*\", \ \"cities\": { \ \"city\": [\"乌鲁木齐\"] \ } \ }] \ }"; cJSON *json = cJSON_Parse(jsonStr); if ( NULL != json ) { cJSON * temp = cJSON_GetObjectItem(json, "name"); if ( NULL != temp ) printf( "name : %s\n", temp->valuestring); temp = cJSON_GetObjectItem(json, "province"); printf( "province : \n"); if ( NULL != temp ) { int i = 0; int icount = cJSON_GetArraySize(temp); for (; i < icount; ++i) { cJSON * province = cJSON_GetArrayItem(temp, i); if ( NULL != province) { cJSON * name = NULL; cJSON * cities = NULL; name = cJSON_GetObjectItem(province, "name"); cities = cJSON_GetObjectItem(province, "cities"); if ( NULL != name ) printf(" name : %s\n", name->valuestring); printf(" cities : \n"); if ( NULL != cities ) { cJSON * city = cJSON_GetObjectItem(cities, "city"); printf (" city:"); if ( NULL != city ) { int j = 0; int jcount = cJSON_GetArraySize(city); for (; j < jcount; ++j) { cJSON *cityItem = cJSON_GetArrayItem(city, j); if ( NULL != cityItem ) printf ("%s ", cityItem->valuestring); } } printf ("\n\n"); } } } } cJSON_Delete(json); json = NULL; } return 0; }