*下载地址GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C*
直接引入cJSONN库,两个文件分别是cJSON.c和cJSON.h。
C创建JSON字符串
// 创建json 根节点
cJSON* root = cJSON_CreateObject();
// 创建json数组
cJSON* pArray = cJSON_CreateArray();
// 把数组添加进入跟节点当中 arr1是json名称 名称可以随意
cJSON_AddItemToObject(root, "arr1", pArray);
//添加字符串
// cJSON_CreateXXX()
// cJSON_CreateNumber()
// cJSON_CreateString()
// cJSON_CreateBool() ...
cJSON_AddItemToArray(pArray, cJSON_CreateString("str1"));
cJSON_AddItemToArray(pArray, cJSON_CreateString("str2"));
cJSON_AddItemToArray(pArray, cJSON_CreateString("str3"));
// 在创建一个数组
cJSON* pArray1 = cJSON_CreateArray();
// 新数组添加进入节点中
cJSON_AddItemToObject(root, "arr2", pArray1);
for (int i = 0; i < 3; ++i)
{
cJSON* obj = cJSON_CreateObject();
//把对象添加进入json数组中
cJSON_AddItemToArray(pArray1, obj);
// 添加元素进入对象中
cJSON_AddStringToObject(obj, "name", "nameValue");
cJSON_AddStringToObject(obj, "sex", "sexValue");
cJSON_AddNumberToObject(obj, "age", 20 + i);
}
// 添加普通节点
cJSON_AddStringToObject(root, "status", "OK");
//返回JSON字符串 需要自动释放否则会内存泄漏 带格式
//char* szJSON = cJSON_Print(root);
//printf("%s", szJSON);
//free(szJSON);
//cJSON_PrintUnformatted 无格式JSON
char* szJSON = cJSON_PrintUnformatted(root);
printf("%s", szJSON);
free(szJSON);
// 是否根节点 必须手动释放,如果数组和新建的对象有关联则会自动释放
cJSON_Delete(root);
C解析JSON字符串
char* json = "{\"arr1\":[\"str1\",\"str2\",\"str3\"] \
,\"arr2\":[{\"name\":\"nameValue\",\"sex\":\"sexValue\",\"age\":20} \
,{\"name\":\"nameValue\",\"sex\":\"sexValue\",\"age\":21} \
,{\"name\":\"nameValue\",\"sex\":\"sexValue\",\"age\":22}] \
,\"status\":\"OK\"}";
// 解析json 如果解析失败root == NULL 需要主动判断
cJSON* root = cJSON_Parse(json);
// 同上 获取JSON中的对象
cJSON* arr1 = cJSON_GetObjectItem(root, "arr1");
cJSON* arr2 = cJSON_GetObjectItem(root, "arr2");
// 获取状态
cJSON* status = cJSON_GetObjectItem(root, "status");
// 判断类型释放匹配
if (status && status->type & cJSON_String)
printf("%s\n", status->valuestring);
else
printf("解析 status 失败\n");
if (arr1 && arr1->type && cJSON_Array)
{
// 获取数组长度
int size = cJSON_GetArraySize(arr1);
for (int i = 0; i < size; ++i)
{
cJSON* item = cJSON_GetArrayItem(arr1, i);
if (item && item->type & cJSON_String)
{
printf("arr1:%s\n", item->valuestring);
}
}
}
if (arr2 && arr2->type && cJSON_Array)
{
// 获取数组长度
int size = cJSON_GetArraySize(arr2);
for (int i = 0; i < size; ++i)
{
cJSON* item = cJSON_GetArrayItem(arr2, i);
if (item && item->type & cJSON_Object)
{
// 这里同样需要判断 我这里省略了
printf("arr1:%s:%s"
, cJSON_GetObjectItem(item, "name")->string, cJSON_GetObjectItem(item, "name")->valuestring);
printf("-----%s:%s"
, cJSON_GetObjectItem(item, "sex")->string, cJSON_GetObjectItem(item, "sex")->valuestring);
printf("-----%s:%d\n"
, cJSON_GetObjectItem(item, "age")->string,cJSON_GetObjectItem(item, "age")->valueint);
}
}
}
cJSON_Delete(root);