使用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; -
}