使用cJSON解析JSON数据
作者:hahaya
日期:2014-04-25
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,可以把JSON的结构理解成无序的、可嵌套的key-value键值对集合,这些key-value键值对以结构体或数组的形式来组织的。同一级的key-value键值对之间用一个,(逗号)隔开,每个key-value键值对是由一个key后面紧接一个:(冒号),冒号后面是这个key对应的value。key是一个word,由大小写字母、下划线及数字组成,可以由双引号封闭,也可以不用双引号。而value的取值集为:number、boolean(true、false)、null、string、object和array。更多关于JSON的介绍,请自行google~
关于JSON的解析我使用的库是cJSON,cJSON是C语言写的一个JSON解析库,项目地址http://sourceforge.net/projects/cjson/,用起来比较简单、方便,在test.c文件中有很多使用的例子,如果不明白使用方法可以看看cJSON.h和cJSON.c,不是太深奥,实际上使用一个双链表来记录JSON数据,然后对这个双链表进行增删改查等操作。
下面就使用一个简单的例子来演示如何使用cJSON,假设有一个名为test的文件,其中的内容如下:
-
{
-
"name":"EVDI",
-
"data":{
-
"id":1,
-
"username":"hahaya",
-
"userpass":"123456",
-
"version"
-
}
-
}
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
#include <stdint.h>
-
#include "cJSON.h" //需要把该头文件放在后面包含 否则会找不到size_t
-
//解析JSON
-
void parse_json(const char *filename)
-
{
-
printf("----------------parse json start-------------------------------\n");
-
//从文件中读取要解析的JSON数据
-
FILE *fp = fopen(filename, "r");
-
fseek(fp, 0, SEEK_END);
-
long len = ftell(fp);
-
fseek(fp, 0, SEEK_SET);
-
char *data = (char*)malloc(len + 1);
-
fread(data, 1, len, fp);
-
fclose(fp);
-
printf("%s", data);
-
//解析JSON数据
-
cJSON *root_json = cJSON_Parse(data); //将字符串解析成json结构体
-
if (NULL == root_json)
-
{
-
printf("error:%s\n", cJSON_GetErrorPtr());
-
cJSON_Delete(root_json);
-
return;
-
}
-
//"name":"EVDI"
-
cJSON *name_json = cJSON_GetObjectItem(root_json, "name");
-
if (name_json != NULL)
-
{
-
char *name = cJSON_Print(name_json); //将JSON结构体打印到字符串中 需要自己释放
-
printf("name:%s\n", name);
-
free(name);
-
}
-
//"data":"..."
-
//id
-
cJSON *data_json = cJSON_GetObjectItem(root_json, "data");
-
int id = cJSON_GetObjectItem(data_json, "id")->valueint;
-
printf("id:%d\n", id);
-
//username
-
char *username = cJSON_Print(cJSON_GetObjectItem(data_json, "username"));
-
printf("username:%s\n", username);
-
free(username);
-
//userpass
-
char *userpass = cJSON_Print(cJSON_GetObjectItem(data_json, "userpass"));
-
printf("userpass:%s\n", userpass);
-
free(userpass);
-
//version
-
char *version = cJSON_Print(cJSON_GetObjectItem(data_json, "version"));
-
printf("version:%s\n", version);
-
free(version);
-
free(data);
-
printf("----------------parse json end--------------------------------\n");
-
}
-
//创建JSON
-
void create_json()
-
{
-
printf("----------------create json start-----------------------------\n");
-
//组JSON
-
cJSON *root_json = cJSON_CreateObject();
-
cJSON_AddItemToObject(root_json, "name", cJSON_CreateString("EVDI"));
-
cJSON *data_json = cJSON_CreateObject();
-
cJSON_AddItemToObject(root_json, "data", data_json);
-
//添加的另一种方式:cJSON_AddNumberToObject(data_json, "id", 1);通过源码发现仅仅是对cJSON_AddItemToObject的define
-
cJSON_AddItemToObject(data_json, "id", cJSON_CreateNumber(1));
-
//添加的另一种方式:cJSON_AddStringToObject(data_json, "username", "hahaya");
-
cJSON_AddItemToObject(data_json, "username", cJSON_CreateString("hahaya"));
-
cJSON_AddItemToObject(data_json, "userpass", cJSON_CreateString("123456"));
-
cJSON_AddItemToObject(data_json, "version", cJSON_CreateString("1.0"));
-
//打印JSON
-
char *out = cJSON_Print(root_json);
-
printf("%s\n", out);
-
free(out);
-
printf("----------------create json end-------------------------------\n");
-
}
-
int main()
-
{
-
parse_json("test");
-
create_json();
-
return 0;
-
}