*cJSON* cJson是一个用于解析json文件的库,它由c语言编写,开源、使用简单。 *json文件的格式*整个json文件可以看成由对象,数组,键值对三种元素的各种嵌套组成,各元素使用,分割。 键值对: "name":value对象:使用{}作为一个整体 数组:使用 []作为一个整体。其内容可以是下面几种元素的任意组合 对象:[{...},{...}] 键值对的value
typedef struct cJSON{
struct cJSON *next;//兄弟指针,指向后一个节点
struct cJSON *prev;//兄弟指针,指向前一个节点
struct cJSON *child;//儿子节点,指向子对象/数组
int type; //键值对中value值的类型
char *valuestring; //如果type为字符串flag,则此处为value的字符串值
int valueint; //如果type为数值flag,则此处为value的整型值
double valuedouble; //如果type为数值flag,则此处为value的浮点型值
char *string; //键值对的name名称
} cJSON;*使用cJSON库生成json文件*#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
#include "string.h"
int main(void)
{
char *cjson_str = NULL;
cJSON *root = cJSON_CreateObject();
cJSON *relation = cJSON_CreateObject();
cJSON *love = cJSON_CreateObject();
cJSON *friend = cJSON_CreateObject();
cJSON *interest = cJSON_CreateArray();
/* 根节点下添加元素 */
cJSON_AddItemToObject(root, "name", cJSON_CreateString("guoweilkd"));//在对象中插入字符串
cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(18)); //在对象中插入整型数值
cJSON_AddItemToObject(root, "high", cJSON_CreateNumber(166.9)); //在对象中插入浮点数值
cJSON_AddItemToObject(root, "married", cJSON_CreateFalse()); //在对象中插入bool量
/* 在root节点下添加relation子对象 */
cJSON_AddItemToObject(root, "relation", relation);
/* 在relation节点下添加love子对象 */
cJSON_AddItemToObject(relation, "love", love);
cJSON_AddItemToObject(love, "name", cJSON_CreateString("noName"));
cJSON_AddItemToObject(love, "loveTime", cJSON_CreateNumber(6));
cJSON_AddItemToObject(love, "age", cJSON_CreateNumber(19));
cJSON_AddItemToObject(friend, "name", cJSON_CreateString("noName"));
cJSON_AddItemToObject(friend, "loveTime", cJSON_CreateNumber(6));
cJSON_AddItemToObject(friend, "age", cJSON_CreateNumber(19));
/* 在relation节点下添加interest子对象 */
cJSON_AddItemToObject(relation, "interest", interest);
cJSON_AddItemToArray(interest,cJSON_CreateString("篮球")); //在数组中插入字符串
cJSON_AddItemToArray(interest,cJSON_CreateNumber(66.666)); //在数组中插入数值
cJSON_AddItemToArray(interest,cJSON_CreateNumber(19));
cJSON_AddItemToArray(interest,cJSON_CreateTrue()); //在数组中插入bool
cJSON_AddItemToArray(interest,friend); //在数组中插入对象
cjson_str = cJSON_Print(root); //将json转化为字符串,
/* 将json写入文件 */
FILE *pf = fopen("test.json","w");
fwrite(cjson_str,strlen(cjson_str),1,pf);
fclose(pf);
free(cjson_str); //释放cJSON_Print()函数申请的内存
cJSON_Delete(root); //删除一个cJSON实体和所有子实体
return 0;
}
{
"name": "guoweilkd",
"age": 18,
"high": 166.9,
"married": false,
"relation":
{
"love":
{
"name": "noName",
"loveTime": 6,
"age": 19
},
"interest":
["篮球", 66.666, 19, true,
{
"name": "noName",
"loveTime": 6,
"age": 19
}
]
}
}*使用cJSON库解析json文件*#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
#include <sys/stat.h>
void main(void)
{
/* 获取文件大小 */
struct stat fileBuff;
stat("test.json",&fileBuff);
printf("file size:%ld\\n",fileBuff.st_size);
/* 为解析json文件分配缓存 */
char *pBuff = (char *)malloc(fileBuff.st_size);
FILE *pf = fopen("test.json","r");
fread(pBuff,fileBuff.st_size,1,pf);//将文件读入缓存
fclose(pf);
printf("file content:\\n");
//printf("%s\\n",pBuff);
/* 解析json文件 */
cJSON *root = NULL;
root = cJSON_Parse(pBuff);
if(root == NULL){
printf("parse error:%s\\n",cJSON_GetErrorPtr());
return;
}
/* 方式1. 通过属性名查找 */
cJSON *pName = cJSON_GetObjectItem(root, "name");
if(pName == NULL){
printf("error\\n");
}
else if(pName->type == cJSON_String){
printf("%s\\n",pName->valuestring);
}
/* 方式2. 按照链表的格式,遍历查找 */
for(cJSON *pCur = root->child;pCur != NULL; pCur = pCur->next){
switch(pCur->type){
case cJSON_Invalid:break;
case cJSON_False :printf("%s = false\\n",pCur->string);break;
case cJSON_True :printf("%s = true\\n", pCur->string);break;
case cJSON_NULL :printf("%s = null\\n", pCur->string);break;
case cJSON_Number :printf("%s = %d\\n",pCur->string,pCur->valueint);break;
case cJSON_String :printf("%s = %s\\n",pCur->string,pCur->valuestring);break;
case cJSON_Array :printf("%s = array\\n",pCur->string);break;
case cJSON_Object :printf("%s = object\\n",pCur->string);break;
default:printf("type:%d\\n",pCur->type);break;
}
}
/* 获取数组大小和元素 */
cJSON *pTemp = cJSON_GetObjectItem(root, "relation");
cJSON *pInterest = cJSON_GetObjectItem(pTemp, "interest");
int ItemsNum = cJSON_GetArraySize(pInterest); //获取数组大小
printf("%s items is %d\\n",pInterest->string,ItemsNum);
for(int i = 0; i < ItemsNum; i++){
cJSON *pCur = cJSON_GetArrayItem(pInterest,i);
switch(pCur->type){
case cJSON_Invalid:break;
case cJSON_False :printf("[%d] = false\\n",i);break;
case cJSON_True :printf("[%d] = true\\n",i);break;
case cJSON_NULL :printf("[%d] = null\\n",i);break;
case cJSON_Number :printf("[%d] = %f\\n",i,pCur->valuedouble);break;
case cJSON_String :printf("[%d] = %s\\n",i,pCur->valuestring);break;
case cJSON_Array :printf("[%d] = array\\n",i);break;
case cJSON_Object :printf("[%d] = object\\n",i);break;
default:printf("type[%d]:%d\\n",i,pCur->type);break;
}
}
/* 获取数组中对象的元素 */
pTemp = cJSON_GetArrayItem(pInterest,4);
cJSON *pt = cJSON_GetObjectItem(pTemp, "name");
printf("%s:%s\\n",pt->string,pt->valuestring);
cJSON_Delete(root);
}
|