cJson

 
以前做工控要求实时性是不可能用到的,现在做物联网是大概率都会遇到,物联网意味着与云平台对接,需要传输大量复杂的通讯信息,而且物联网大部分对设备实时性要求不高,轻量级的cjson格式是个非常不错的选择。
 
 
 
typedef struct cJSON { struct cJSON *next,*prev;/* 遍历数组或对象链的前向或后向链表指针*/ struct cJSON *child; /*数组或对象的孩子节点*/ int type; /* key的类型*/ char *valuestring; /*字符串值*/ int valueint; /* 整数值*/ double valuedouble; /* 浮点数值*/ char *string; /* key的名字*/ } cJSON;
 
 
/* 将普通的json字符串处理成json对象,注意:使用完后需要将json指针释放*/
extern cJSON *cJSON_Parse(const char *value);
 
/*将cjson格式的数据,转换为普通字符串的新式,虽然json格式的数据也是一个字符串的样子,但这时候还是无法当成普通的字符串使用,注意:使用完后需要将json指针释放*/
extern char *cJSON_Print(cJSON *item);
 
/*将cjson格式的数据,以没有格式的形式转换成普通的字符串:也就是字符串中间不会有"\n" "\t"之类的东西存在,注意:使用完后需要将json指针释放*/
extern char *cJSON_PrintUnformatted(cJSON *item);
 
/*使用缓冲策略将cJSON实体呈现为文本。预缓冲是对最终大小的猜测。猜测良好可以减少重新分配。fmt=0给出未格式化,=1给出格式化*/
extern char *cJSON_PrintBuffered(cJSON *item,int prebuffer,int fmt);
 
/*释放内存*/
extern void cJSON_Delete(cJSON *c);
 
/*获取数组里面元素的个数,指针array是一个指向数组的对象*/
extern int cJSON_GetArraySize(cJSON *array);
 
/*获取数组里面的元素,这个元素也可能是对象,item是对应元素的下标*/
extern cJSON *cJSON_GetArrayItem(cJSON *array,int item);
 
/*获取键值内容(对象里面的对象),用一个新的 json 指针,指向该对象*/
extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
 
/*判断是否有key键值是string的项,如果有返回1,否则返回0*/
extern int cJSON_HasObjectItem(cJSON *object,const char *string);
 
 
/*当使用cJSON_Prase()函数解析数据时,如果失败就可以调用该函数,该函数会返回错误的原因*/
extern const char *cJSON_GetErrorPtr(void);
/* 这些是构造json的一些API */
extern cJSON *cJSON_CreateNull(void); //创建一个空对象,暂时保留以后可能要用到
extern cJSON *cJSON_CreateTrue(void); //创建一个true的对象
extern cJSON *cJSON_CreateFalse(void); //创建一个false的对象
extern cJSON *cJSON_CreateBool(int b); //创建一个bool对象
extern cJSON *cJSON_CreateNumber(double num); //创建一个数字类型的对象
extern cJSON *cJSON_CreateString(const char *string); //创建一个字符串类型的对象
extern cJSON *cJSON_CreateArray(void); //创建一个数组类型的对象
extern cJSON *cJSON_CreateObject(void); //创建一个根对象,它是cjson格式的头结点
 
/* 创建数组其中里面可以设定为不同的数据类型*/
extern cJSON *cJSON_CreateIntArray(const int *numbers,int count); //整形
extern cJSON *cJSON_CreateFloatArray(const float *numbers,int count); //浮点型
extern cJSON *cJSON_CreateDoubleArray(const double *numbers,int count); //double型
extern cJSON *cJSON_CreateStringArray(const char **strings,int count); //字符串类型
 
/* 向数组中添加对象*/
extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
 
/*向对象中添加键值对,值的类型与相关函数有关*/
extern void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
 
/*当字符串肯定是const(即一个文字,或者与常量一样好),并且肯定能在cJSON对象中存活下来时,可以使用这个*/
extern void cJSON_AddItemToObjectCS(cJSON *object,const char *string,cJSON *item);
 
/* 将对项的引用附加到指定的数组/对象。当您想要将现有的cJSON添加到新的cJSON中,但又不想破坏现有的cJSON时,请使用此选项 */
extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
extern void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item);
 
/* 从数组/对象中删除/分离项 */
extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which);
extern void cJSON_DeleteItemFromArray(cJSON *array,int which);
extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string);
extern void cJSON_DeleteItemFromObject(cJSON *object,const char *string);
/* 更新数组项 */
extern void cJSON_InsertItemInArray(cJSON *array,int which,cJSON *newitem);//右移
extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem);
extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
 
/* 复制一个cJSON项 */
extern cJSON *cJSON_Duplicate(cJSON *item,int recurse);
/* Duplicate将在新的内存中创建与传递的cJSON相同的新项需要释放。递归!=0,它将复制与项连接的任何子节点。item->next和->prev指针从Duplicate返回时总是为0。*/
 
/* ParseWithOpts允许您要求(并检查)JSON终止为空,并检索到解析的最后一个字节的指针 */
/* 如果在return_parse_end中提供ptr,并且解析失败,那么return_parse_end将包含一个指向错误的指针。如果没有,那么cJSON_GetErrorPtr()就可以了。 */
extern cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated);
 
extern void cJSON_Minify(char *json);
 
/* 用于快速创建内容的宏. */
#define cJSON_AddNullToObject(object,name)
#define cJSON_AddTrueToObject(object,name)
#define cJSON_AddFalseToObject(object,name)
#define cJSON_AddBoolToObject(object,name,b)
#define cJSON_AddNumberToObject(object,name,n)
#define cJSON_AddStringToObject(object,name,s)
 
/*当分配一个整数值时,它也需要传播到valuedouble */
#define cJSON_SetIntValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val))
#define cJSON_SetNumberValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val))
 
/*用于迭代数组的宏 */
#define cJSON_ArrayForEach(pos, head) for(pos = (head)->child; pos != NULL; pos = pos->next)
 
hook管理函数:
在 c 语言中内存一般是 malloc 和 free 的。
为了方便用户自由的管理内存, cjson 使用 Hook 技术来让使用者可以自定义内存管理函数。
即用户自定义 malloc 和 free.
具体实现方式可以参考下面的代码, 默认使用系统的 malloc 和 free 函数, 用过 cJSON_InitHooks 函数可以替换成用户自定义的 malloc 和 free 函数。
typedef struct cJSON_Hooks {
void *(*malloc_fn)(size_t sz);
void (*free_fn)(void *ptr);
} cJSON_Hooks;
 
/* 对cJSON提供的分配,重分配,释放内存初始化函数 */
extern void cJSON_InitHooks(cJSON_Hooks* hooks);
 
1、先分支再综合,先写子类在写父类
2、使用了cJSON_Parse,解析完之后一定要cJSON_Delete释放链表
3、使用打印函数cJSON_PrintUnformatted等有申请内存的一定要free释放内存
4、注意启动文件中设置一下堆的大小,防止数据溢出

posted @ 2020-12-22 16:36  WCW的故事  阅读(522)  评论(0编辑  收藏  举报