[TOC]
cJSON 库只有 cJSON.c、cJSON.h 这两个文件,非常方便引入到项目中,而其中的方法也非常简单,看看头文件,自己写个例子测试一下,基本就可以满足日常工作需求了
0. 看代码回忆
存入和取出
int main()
{
char *str_arr = NULL;
char *str_obj = NULL;
// ================= JSON 对象转换为字符串 =================
// 创建 JSON 数组
cJSON *json_arr = cJSON_CreateArray();
// 创建 JSON 对象
cJSON *json_obj = cJSON_CreateObject();
// 解析后用来存放的 JSON
cJSON *json_arr_parse = NULL;
cJSON *json_obj_parse = NULL;
cJSON *json_item_parse = NULL;
// 向 JSON 对象中添加键值对内容
cJSON_AddStringToObject(json_obj, "key01", "value01");
cJSON_AddNumberToObject(json_obj, "key02", 2);
cJSON_AddBoolToObject(json_obj, "key03", true);
cJSON_AddTrueToObject(json_obj, "key04");
cJSON_AddFalseToObject(json_obj, "key05");
cJSON_AddNullToObject(json_obj, "key06");
// 将 JSON 对象添加到 JSON 数组中
cJSON_AddItemToArray(json_arr, json_obj);
// 将 JSON 对象的内容格式化后存入字符串中
str_obj = cJSON_Print(json_obj);
printf("str_obj:%s\n", str_obj);
// 将 JSON 数组的内容格式化后存入字符串中
str_arr = cJSON_Print(json_arr);
printf("str_arr:%s\n", str_arr);
// 根据key修改值
cJSON_ReplaceItemInObject(json_obj, "key01", cJSON_CreateString("666666"));
// 不能这么修改,类型不一致
//cJSON_ReplaceItemInObject(json_obj, "key05", cJSON_CreateString("666666"));
str_arr = cJSON_Print(json_arr);
printf("str_arr:%s\n", str_arr);
// ================= 字符串解析为 JSON 对象 =================
json_arr_parse = cJSON_Parse((const char *)str_arr);
// 从 json 数组中取值
json_obj_parse = cJSON_GetArrayItem(json_arr_parse, 0);
// 从 json 对象中取值
json_item_parse = cJSON_GetObjectItem(json_obj_parse, "key02");
printf("json-key:%s\n", json_item_parse->string);
printf("json-type:%d\n", json_item_parse->type);
/* */
switch (json_obj_parse->type) {
case 1: // false
printf("false\n");
break;
case 2: // true
printf("true\n");
break;
case 4:// null
printf("null\n");
break;
case 8: // int
printf("int\n");
case 16: // 字符串
printf("string\n");
break;
case 32: // 数组
printf("array\n");
break;
case 64: // 对象
printf("object\n");
break;
}
printf("json-value:%s\n", json_item_parse->valuestring);
// 释放 JSON 对象,可以释放整个内存
cJSON_Delete(json_arr);
return 0;
}
1. cJSON 的结构体
typedef struct cJSON {
struct cJSON *next,*prev; /* 遍历数组或对象链的前向或后向链表指针*/
struct cJSON *child; /*数组或对象的孩子节点*/
int type; /* key的类型*/
char *valuestring; /*字符串值*/
int valueint; /* 整数值*/
double valuedouble; /* 浮点数值*/
char *string; /* key的名字*/
} cJSON;
2. cJSON 的修改对应值
看了头文件和几篇文件都没有找到修改对应值方法,于是找源码发现了这一段
#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
cJSON *cJSON_CreateString(const char *string) {
cJSON *item=cJSON_New_Item();
if(item){
item->type=cJSON_String;
item->valuestring=cJSON_strdup(string);
}
return item;
}
实际上文字不是直接填入 cJSON 中,而是通过将值包裹到 cJSON 的 item 中,所以我使用这个方法自己创造一个 cJSON 对象进行替换就能达到替换值
cJSON_ReplaceItemInObject(json_obj, "key01", cJSON_CreateString("666666"));
参考资料
参考资料
cJSON:简单好用的C语言JSON库
网友评论