一,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