cjson学习

一,cJSON结构体

typedef struct cJSON {
	struct cJSON *next,*prev;	/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
	struct cJSON *child;		/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
	int type;					/* The type of the item, as above. */
	char *valuestring;			/* The item's string, if type==cJSON_String */
	int valueint;				/* The item's number, if type==cJSON_Number */
	double valuedouble;			/* The item's number, if type==cJSON_Number */
	char *string;				/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
} cJSON;

二,一些cJSON函数

1,extern cJSON *cJSON_Parse(const char *value); 

作用:从缓冲区中解析出JSON结构,解析一块JSON数据返回cJSON结构, 在使用完之后调用cJSON_Delete函数释放json对象结构。

例子:

char *ptr = "{\"name\":\"sunshuai\"}";
cJSON *cj = cJSON_Parse(ptr);
cJSON_Delete(cj);

2,extern char *cJSON_Print(cJSON *item); 

作用:将传入的JSON结构转化为字符串,可用于输出到输出设备, 使用完之后free(char *) 。

例子:

char *tmp = cJSON_Print(cj);
printf("%s\n",tmp);
free(tmp);

3,创建一个值类型的数据 :

extern cJSON *cJSON_CreateNumber(double num);
extern cJSON *cJSON_CreateString(const char *string);
extern cJSON *cJSON_CreateArray(void);

4,创建一个对象(文档) :

extern cJSON *cJSON_CreateObject(void);

5,数组创建以及添加 :

cJSON *cJSON_CreateIntArray(const int *numbers,int count);
void cJSON_AddItemToArray(cJSON *array, cJSON *item);  

6,JSON嵌套 :

【 向对象中增加键值对】 cJSON_AddItemToObject(root, "name", 值类型数据相关函数());
【 向对象中增加数组】 cJSON_AddItemToObject(root, "name", cJSON_CreateArray());
【 向数组中增加对象】 cJSON_AddItemToArray(array, cJSON_CreateObject());

7,几个能提高操作效率的宏函数 :

#define cJSON_AddNumberToObject(object,name,n) \
cJSON_AddItemToObject(object, name,cJSON_CreateNumber(n))
 #define cJSON_AddStringToObject(object,name,s)\
 cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) 

8,根据键找json结点 :

extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string)

找到节点后就可以得出相应的值

9,返回数组结点array中成员的个数 :

extern int cJSON_GetArraySize(cJSON *array);

10,根据数组下标index取array数组结点的第index个成员 返回该成员节点 :

extern cJSON *cJSON_GetArrayItem(cJSON *array,int index);

11,遍历数组 :

#define cJSON_ArrayForEach(pos, head)        for(pos = (head)->child; pos != NULL; pos = pos->next)

 

三,一个例子

#include <cJSON.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#define SUN
void test();
int main(int argc ,char** argv)
{
  test();
  return 0;
}
void test(void)
{
 FILE* fp;
 cJSON* tmp = NULL;
 char *ptr = NULL;
 cJSON* root = cJSON_CreateObject();
 cJSON* item1 = cJSON_CreateObject();
 cJSON* item2 = cJSON_CreateObject();
 cJSON* item3 = cJSON_CreateObject();
 cJSON* array = cJSON_CreateArray();
 cJSON_AddItemToArray(array, item1);
 cJSON_AddItemToArray(array, item2);
 cJSON_AddItemToArray(array, item3);
 cJSON_AddItemToObject(root, "array1", array);
 fp = fopen("StringAndInt.json","w");

 cJSON_AddStringToObject(item1, "name1","小红");
 cJSON_AddStringToObject(item1, "name2","小明");


 cJSON_AddNumberToObject(item2, "name3",1);
 cJSON_AddNumberToObject(item2, "name4",2);

 cJSON_AddStringToObject(item3, "name5","小孙");
 cJSON_AddNumberToObject(item3, "name6",3);

 tmp = cJSON_GetArrayItem(array, 0);
 ptr = cJSON_Print(tmp);
 printf("%s\n",ptr);

 //cJSON_AddItemToObject(root,);
 #ifdef SUN
 tmp = cJSON_GetObjectItem(root,"name1");
 if(tmp)
 {
  printf("%s\n",tmp->valuestring);
 }
 tmp = cJSON_GetObjectItem(root,"name4");
 if(tmp)
 {
  printf("%d\n",tmp->valueint);
 }
 #endif
 ptr = cJSON_Print(root);
 printf("%s\n",ptr);
 fwrite(ptr, strlen(ptr), 1, fp);
 fclose(fp);
 cJSON_Delete(root);
}

输出结果:

{
 "name1": "小红",
 "name2": "小明"
}
{
 "array1": [{
   "name1": "小红",
   "name2": "小明"
  }, {
   "name3": 1,
   "name4": 2
  }, {
   "name5": "小孙",
   "name6": 3
  }]
}

 

编译时加 -lcjson.在

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"

int create_js(void) {	//创建简单的json
	cJSON *root;
	root = cJSON_CreateObject();
	if (!root) {
		printf("get root faild !\n");
		return -1;
	} else
		printf("get root success!\n");

	cJSON * js_body;

	const char * const body = "body";
	cJSON_AddItemToObject(root, body, js_body = cJSON_CreateObject());
	cJSON_AddStringToObject(js_body, "name", "xiaohui");
	cJSON_AddNumberToObject(js_body, "value", 600);
	char *s = cJSON_PrintUnformatted(root);
	if (s) {
		printf("create js string is %s\n", s);
		free(s);
	}
	cJSON_Delete(root);

	return 0;
}

int create_jsArray(void) //创建数组
{
	cJSON *root;
	root = cJSON_CreateArray();
	cJSON_AddItemToArray(root, cJSON_CreateString("Hello world"));
	cJSON_AddItemToArray(root, cJSON_CreateNumber(10));
	{
       char *s = cJSON_Print(root);
		char *s = cJSON_PrintUnformatted(root);
		if (s) {
			printf(" %s \n", s);
			free(s);
		}
	}
	if (root)
		cJSON_Delete(root);

	return 0;
}

int create_jsArray2(void) //对象里面一个数组,数组里面包括对象
{
	cJSON *root, *js_body, *js_list;
	root = cJSON_CreateObject();
	cJSON_AddItemToObject(root, "body", js_body = cJSON_CreateArray());
	cJSON_AddItemToArray(js_body, js_list = cJSON_CreateObject());
	cJSON_AddStringToObject(js_list, "name", "xiaohui");
	cJSON_AddNumberToObject(js_list, "status", 100);

	{
		        char *s = cJSON_Print(root);
		char *s = cJSON_PrintUnformatted(root);
		if (s) {
			printf(" %s \n", s);
			free(s);
		}
	}
	if (root)
		cJSON_Delete(root);

	return 0;
}

int parse_js() {
	char *s = "{\"name\":\"xiao hong\",\"age\":10}";
	cJSON *root = cJSON_Parse(s);
	if (!root) {
		printf("get root faild !\n");
		return -1;
	}
	cJSON *name = cJSON_GetObjectItem(root, "name");
	if (!name) {
		printf("No name !\n");
		return -1;
	}
	printf("name type is %d\n", name->type);
	printf("name is %s\n", name->valuestring);

	cJSON *age = cJSON_GetObjectItem(root, "age");
	if (!age) {
		printf("no age!\n");
		return -1;
	}
	printf("age type is %d\n", age->type);
	printf("age is %d\n", age->valueint);
	return 0;
}

int parse_js2() {
	char *s =
			"{\"list\":{\"name\":\"xiao hong\",\"age\":10},\"other\":{\"name\":\"hua hua\"}}";
	cJSON *root = cJSON_Parse(s);
	if (!root) {
		printf("get root faild !\n");
		return -1;
	}

	cJSON *js_list = cJSON_GetObjectItem(root, "list");
	if (!js_list) {
		printf("no list!\n");
		return -1;
	}
	printf("list type is %d\n", js_list->type);

	cJSON *name = cJSON_GetObjectItem(js_list, "name");
	if (!name) {
		printf("No name !\n");
		return -1;
	}
	printf("name type is %d\n", name->type);
	printf("name is %s\n", name->valuestring);

	cJSON *age = cJSON_GetObjectItem(js_list, "age");
	if (!age) {
		printf("no age!\n");
		return -1;
	}
	printf("age type is %d\n", age->type);
	printf("age is %d\n", age->valueint);

	cJSON *js_other = cJSON_GetObjectItem(root, "other");
	if (!js_other) {
		printf("no list!\n");
		return -1;
	}
	printf("list type is %d\n", js_other->type);

	cJSON *js_name = cJSON_GetObjectItem(js_other, "name");
	if (!js_name) {
		printf("No name !\n");
		return -1;
	}
	printf("name type is %d\n", js_name->type);
	printf("name is %s\n", js_name->valuestring);

	if (root)
		cJSON_Delete(root);
	return 0;
}
int parse_jsArray() {
	char *s = "{\"list\":[\"name1\",\"name2\"]}";
	cJSON *root = cJSON_Parse(s);
	if (!root) {
		printf("get root faild !\n");
		return -1;
	}
	cJSON *js_list = cJSON_GetObjectItem(root, "list");
	if (!js_list) {
		printf("no list!\n");
		return -1;
	}
	int array_size = cJSON_GetArraySize(js_list);
	printf("array size is %d\n", array_size);
	int i = 0;
	cJSON *item;
	for (i = 0; i < array_size; i++) {
		item = cJSON_GetArrayItem(js_list, i);
		printf("item type is %d\n", item->type);
		printf("%s\n", item->valuestring);
	}

	if (root)
		cJSON_Delete(root);
	return 0;
}
int parse_jsArray2() {
	char *s =
			"{\"list\":[{\"name\":\"xiao hong\",\"age\":10},{\"name\":\"hua hua\",\"age\":11}]}";
	cJSON *root = cJSON_Parse(s);
	if (!root) {
		printf("get root faild !\n");
		return -1;
	}
	cJSON *js_list = cJSON_GetObjectItem(root, "list");
	if (!js_list) {
		printf("no list!\n");
		return -1;
	}
	int array_size = cJSON_GetArraySize(js_list);
	printf("array size is %d\n", array_size);

	int i = 0;
	cJSON *item, *it, *js_name, *js_age;
	char *p = NULL;
	for (i = 0; i < array_size; i++) {
		item = cJSON_GetArrayItem(js_list, i);
		if (item == NULL) {
			break;
		}
		p = cJSON_PrintUnformatted(item);
		it = cJSON_Parse(p);
		free(p);
		if (!it)
			continue;
		js_name = cJSON_GetObjectItem(it, "name");
		printf("name is %s\n", js_name->valuestring);
		js_age = cJSON_GetObjectItem(it, "age");
		printf("age is %d\n", js_age->valueint);

	}

	if (root)
		cJSON_Delete(root);
	return 0;
}
int main(int argc, char **argv) {
//	create_js(); 		//创建简单的json {"body":{"name":"xiaohui","value":600}}
//	create_jsArray(); 	//创建数组  ["Hello world",10]
//	create_jsArray2();	//复杂数组  {"body":[{"name":"xiaohui","status":100}]}

//	parse_js();			//{"name":"xiao hong","age":10}"
//	parse_js2();		//{"list":{"name":"xiao hong","age":10},"other":{"name":"hua hua"}}";
//	parse_jsArray();	//{"list\":["name1","name2"]}
	parse_jsArray2();//{"list\":[{"name":"xiao hong","age":10},{"name":"hua hua","age":11}]}
	return 0;
}

官网下的源码编译后,把动态库文件放入/usr/lib 然后执行ldconfig.

ldconfig命令的用途主要是在默认搜寻目录/lib/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表,为了让动态链接库为系统所共享,需运行动态链接库的管理命令ldconfig,此执行程序存放在/sbin目录下。如果动态库文件没有放在/lib 和/usr/lib中,需要将动态库目录放入/etc/ld.so.conf中,然后ldconfig
    

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值