c++类 封装cjson_c创建json对象 C/C++下的JSON解析/生成库cJSON - 电脑故障 - 服务器之家...

c创建json对象 C/C++下的JSON解析/生成库cJSON

发布时间:2017-04-24

来源:服务器之家

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,可读性强,同时便于机器生成和解析。cJSON是一个轻量级,便携,单文件的JSON解析器。

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结构体可以看成一个双向链表的节点,并且这个节点可能有儿子节点。一个节点是一个键值对,key的类型为字符串,value的类型可能是字符串或数字(整数或浮点数)或其他JSON对象(比如JSON数组)

第一次接触这个库是在做聊天软件的时候,用JSON字符串在服务器和客户端之间传递消息。因此以传递聊天消息的代码作为示例。

1.将JSON字符串解析为cJSON对象并获取字段值:

char *str = "{\"type\":\"login-receipt\",\"username\":\"entalent\",\"status\":1}";

cJSON* root = cJSON_Parse(str);

char *username = cJSON_GetObjectItem(root, "username")->valuestring;

int status = cJSON_GetObjectItem(root, "status")->valueint;

free(root);

调用cJSON_Parse函数可以解析JSON字符串,并返回指向一个cJSON结构体的指针。调用cJSON_GetObjectItem可以获取一个cJSON结构体(一个键值对),并且可以取出字段值。

对于JSON数组,对应的操作如下:

char *str = "{\"type\":\"friend-list\",\

\"username\":\"entalent\",\

\"size\":2,\

\"list\":[\

{\"username\":\"green\", \"status\":1},\

{\"username\":\"niang\", \"status\":0}\

]}";

cJSON* root = cJSON_Parse(str);

char *username = cJSON_GetObjectItem(root, "username")->valuestring;

cJSON *list = cJSON_GetObjectItem(root, "list");

int size = cJSON_GetArraySize(list);

int i;

for(i = 0; i < size; i++){

cJSON *item = cJSON_GetArrayItem(list, i);

char *username = cJSON_GetObjectItem(item, "username")->valuestring;

int status = cJSON_GetObjectItem(item, "status")->valueint;

printf("%s %d\n", username, status);

}

free(root);

如果cJSON结构体指针指向一个JSON数组,那么调用cJSON_GetArraySize可以获取数组长度,调用cJSON_GetArrayItem可以获取数组中某个位置的元素。(当然位置是从0开始的)

2.将数据转换为JSON字符串并输出:

//create a new cJSON object

cJSON *root = cJSON_CreateObject();

cJSON_AddStringToObject(root, "type", "friend-list");

cJSON_AddNumberToObject(root, "status", 1);

//create a new json array

cJSON *array = cJSON_CreateArray(), *item;

//add the json array to root

cJSON_AddItemToObject(root, "list", array);

int i;

//add new json items to array

for(i = 0; i < 2; i++){

cJSON_AddItemToArray(array, item = cJSON_CreateObject());

cJSON_AddNumberToObject(item, "status", i);

}

char *str = cJSON_Print(root);

printf("%s\n", str);

free(root);

//如果任性的话直接sprintf生成JSON字符串貌似也不是不可以。。。而且JSON字符串的结构比较简单的话貌似效率还更高一点?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值