• 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格式的数据,以没有格式的形式转换成普通的字符串:也就是字符串中间不会有" " " "之类的东西存在,注意:使用完后需要将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、注意启动文件中设置一下堆的大小,防止数据溢出

  • 相关阅读:
    【转】开发人员一定要加入收藏夹的网站
    ASP.NET页面之间传递值的几种方式
    查询数据库中字段内容相同的记录
    将csv文件导入到数据库中
    XMLHttpRequest对象(三)
    Ajax基础(一)
    Ajax浏览器支持(二)
    javascript获取浏览器的
    SQL SERVER 通过链接服务器访问ORACLE 包中的存储过程 带参数
    SQL 添加链接服务器
  • 原文地址:https://www.cnblogs.com/wcw12580/p/14173823.html
Copyright © 2020-2023  润新知