部门的产品使用自己公司研发的系统,嵌入式web服务器移植的是goahead2.5的,服务器和前端使用JSON交互,移植的cJSON库,所以这段时间对JSON的使用做个简单的笔记,cJSON.h提供出来的接口很多,但是感觉平时使用的也就那么几个。

  在做测试的时候,通过创建json对象,添加节点,然后保存,读取,输出这样的一个流程,发现当添加节点数多的时候,会会出现长时间的等待,当时好像是一万行的数据量,整个创建过程花费了2,3秒钟,所以当更多数据量的时候,花费的时间可能更长。最后发现是这个函数导致的结果,源码如下,可以看到它每添加一个item,都是从头往后找,等找到最后一个节点的时候,然后把item赋值给最后一个节点的next,所以节点越多,时间也就更长了。

void   cJSON_AddItemToArray(cJSON *array, cJSON *item)

void   cJSON_AddItemToArray(cJSON *array, cJSON *item)
{
cJSON *c=array->child;
if (!item) return;
if (!c)
{
array->child=item;
}
else
{
while (c && c->next)
c=c->next;
suffix_object(c,item);
}
}

  查看cJSON的结构体,会发现,json结构有next和pre两个指针,也就是它的链表是个双向链表,但是就奇怪为何找节点却不用这个优点,非得单向去找。

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;

  所以解决的思路就在这了,有两种方式解决:

  1,利用array的pre指针,每次插入item后,同时将其指针保存在array->child->pre中,这样我每次插入节点,都只需要找到第一个节点的pre指针,然后将item插到该地址之后,即可。

  cJSON * c = array->child;
if(!item)
{
return ;
}
if(!c)
{
array->child = item;
array->child->prev = item;
}
else
{
array->child->prev->next = item;
array->child->prev = item;
item->next = NULL;
  }

  2,第二种方式就很简单,通过修改json结构体实现目的,在结构体中添加一个成员 struct cJSON * last;每次添加item的时候,同时将它的指针赋值给array->child->last;

这样每次添加的时候,只需要查找last指针就可以找到最后一个节点。

  cJSON * c = array->child;
if(!item)
{
return ;
}
if(!c)
{
array->child = item;
array->child->last = item;
}
else
{
array->child->last->next = item;
array->child->last = item;
item = NULL;
}

  用的最多的object对象就是这些了。

#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)

还有数组对象

void cJSON_AddItemToArray(cJSON *array, cJSON *item);
void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);

如果是将一个数组添加进对象就可以用

void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);

void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item);

当用完json对象时候,就必须记者删除

cJSON_Delete(cJSON*);

将一个字符串解析成json对象

extern cJSON *cJSON_Parse(const char *value);

将一个json对象转换成char *,但是这个字符串必须是手动删除

extern char  *cJSON_Print(cJSON *item);

cJSON 库的使用和优化的更多相关文章

  1. [置顶] cJSON库(构建json与解析json字符串)-c语言

     一.c语言获取json中的数据. 1.先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h. 2.感性认识 char * json = "{ \"json\" ...

  2. 【源码分析】cJSON库学习

    cJSON库是什么? cJSON是一个轻量级的json解析库.使用起来非常简单,整个库非常地简洁,核心功能的实现都在cJSON.c文件,非常适合阅读源代码来学习C语言.最近读完这个库的源码,分享自己收 ...

  3. 使用CJSON库实现XML与JSON格式的相互转化

    之前完成了一个两个平台对接的项目.由于这两个平台一个是使用json格式的数据,一个是使用xml格式的数据,要实现它们二者的对接就涉及到这两个数据格式的转化,在查阅相关资料的时候发现了这个CJSON库, ...

  4. cJSON库的简单介绍及使用

    转载:http://www.cnblogs.com/liunianshiwei/p/6087596.html JSON 语法是 JavaScript 对象表示法语法的子集.数据在键/值对中:数据由逗号 ...

  5. 使用cJSON库解析JSON

    cJSON库的下载 cJSON是一个基于C的JSON解析库,这个库非常简单,只有cJSON.c和cJSON.h两个文件,支持JSON的解析和封装,需要调用时,只需要#include "cJS ...

  6. cjson库

    - 源码方式引用,只有两个文件- 标准C89编写 - [cJSON 库项目地址](https://github.com/DaveGamble/cJSON)

  7. C语言cJSON库的使用,解析json数据格式

    C语言cJSON库的使用,解析json数据格式 摘自:https://www.cnblogs.com/piaoyang/p/9274925.html 对于c语言来说是没有字典这样的结构的,所以对于解析 ...

  8. cJSON库源码分析

    本文采用以下协议进行授权: 自由转载-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. cJSON是一个超轻巧,携带方便,单文件,简单的可以作为A ...

  9. 使用cJSON库解析和构建JSON字符串

    使用cJSON库解析和构建JSON字符串 前言 其实之前的两篇博文已经介绍了json格式和如何使用cJSON库来解析JSON: 使用cJSON库解析JSON JSON简介 当时在MCU平台上使用时,会 ...

随机推荐

  1. MOF编译器无法连接VMI服务器。原因可能是语义错误的解决方案

    安装数据库时报错. 我这个是因为安装SQL SERVER时,没有卸载vs. 一般解决方法: WIN 7安装VS和SQL SERVER的顺序应该是先安装SQL SERVER 然后安装VS,当要重装SQL ...

  2. usaco 2002 月赛 Chores 题解

    Description Farmer John's family pitches in with the chores during milking, doing all the chores as ...

  3. Watson Explorer Analytical Components 1

    Introduction: IBM Watson Explorer Analytical Components(AC) which is part of the IBM Watson Explorer ...

  4. var与let的区别

    var与let的区别 前言: 在没接触Es6之前,我们在js中声明都是通过var来声明变量的,var声明变量虽说方便,但是,又有一些自己的诟病,下边来说一说,这三个的区别! var var相信大家都不 ...

  5. Java 数据类型在实际开发中应用

    在前边的博文中,我已经介绍了Java核心的容器IO等,现在我来说一下java中的数据类型.在java中,一切东西皆为对象(这句话意思是java中绝大数情况都用对象),极少数不是对象的,也存在与之对应的 ...

  6. 如何用快速傅里叶变换实现DFT

    [目标]   如何以 \(O(N \log N)\) 的效率将系数多项式转换为点值多项式. [前置技能]   众所周知,\(x^n=1\)的根有n个,而且它们分别是\(e^{\frac{2*π*i}{ ...

  7. one plus 1(一加1)刷 kali nethunter 教程

    刚刚入手的一加1,刷成了h2os再进行的本次刷机. 用到以下资源: 链接:http://pan.baidu.com/s/1o7S0xzs 密码:2gvm 好了,开始正题,如果你的系统不是H2OS建议先 ...

  8. SAN & vSAN & vSAN storage

    SAN (storage area network ) 定义: Storage area network (SAN) is a network that primarily connects the ...

  9. Git 使用问题 - win7 git bash下git pull失败

    win7 旗舰版,从github上pull代码时,git bash命令出现错误 Administrator@rust-PC /g/rust_proj/cardslib (master) $ git - ...

  10. Hadoop 2.6.5 FileSystem和Configuration两个对象的探究

    Hadoop 2.6.5 FileSystem和Configuration两个对象的探究 版权声明:本文为yunshuxueyuan原创文章,如需转载,请标明出处.[http://www.cnblog ...