cJSON使用


    在编写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);


如果json本身就是json,再次获取这个json对象,cJSON数据则放置在 结构体的对应数据中

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;


接下来 README中提供3种遍历的方法,

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就基本完成了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值