在编写C语言的过程中,遇到需要解析json文本,便在网上搜索,发现一个轻量级的json解析和组装的库。便引入到自己的程序中,性能没有经过对比,不敢妄自评论,只是使用起来还是比较方便的。README中告诉我们,这是使用起来最"愚蠢“的解析器。
资源下载
既然是开源的库,那先代码下下来 http://sourceforge.net/projects/cjson/。
使用方法 (查看README)
1. 将cJSON.c 和 cJSON.h加入你的代码中,然后进行编译即可。
接下来我们尝试解析下面这个json
Some JSON:
{
"name": "Jack (\"Bee\") Nimble",
"format": {
"type": "rect",
"width": 1920,
"height": 1080,
"interlace": false,
"frame rate": 24
}
}
首先解析整个json
cJSON *root = cJSON_Parse(my_json_string);
cJSON *format = cJSON_GetObjectItem(root,"format");
int framerate = cJSON_GetObjectItem(format,"frame rate")->valueint;
记住一定要释放内存
cJSON_Delete(root);
2. 接下来 我们了解 cJSON这个结果
typedef struct cJSON {
struct cJSON *next,*prev;
struct cJSON *child;
int type;
char *valuestring;
int valueint;
double valuedouble;
char *string; //当child为一个对象时,这个值将是当前节点的名称
} cJSON;
1. 使用回调函数来进行对节点的操作,即通过对节点名称的判断来决定需要执行的操作。
void parse_and_callback(cJSON *item,const char *prefix)
{
while (item)
{
char *newprefix=malloc(strlen(prefix)+strlen(item->name)+2);
sprintf(newprefix,"%s/%s",prefix,item->name);
int dorecurse=callback(newprefix, item->type, item);
if (item->child && dorecurse) parse_and_callback(item->child,newprefix);
item=item->next;
free(newprefix);
}
}
int callback(const char *name,int type,cJSON *item)
{
if (!strcmp(name,"name"))
else if (!strcmp(name,"format/type")
else if (!strcmp(name,"format/width") { /* 800 */ }
else if (!strcmp(name,"format/height") { /* 600 */ }
else if (!strcmp(name,"format/interlace") { /* false */ }
else if (!strcmp(name,"format/frame rate") { /* 24 */ }
return 1;
}
2. 使用数组遍历对json进行操作
void parse_object(cJSON *item)
{
int i; for (i=0;i<cJSON_GetArraySize(item);i++)
{
cJSON *subitem=cJSON_GetArrayItem(item,i);
// handle subitem.
}
}
3. 使用链表对json进行操作(最适当的方法)
void parse_object(cJSON *item)
{
cJSON *subitem=item->child;
while (subitem)
{
// handle subitem
if (subitem->child) parse_object(subitem->child);
subitem=subitem->next;
}
}
接下来,看一下包含了所有典型情况的test.c就基本完成了。