用c写一个简单json处理器
json的原理
object
以{开头 }结尾
基本数据单元是:string:value
基本数据单元用,分隔
array
以[开头 ]结尾
基本数据单元:value
基本数据单元,分隔
value
string number object array true false null
string
是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。
一个字符(character)即一个单独的字符串(character string)。
支持所有的字符串
有如下几种情况是特殊的:
\" \\ \/ \b \f \n \r \t \u
true/false
null
number
正负号
以0或者非开始的任意数字
小数点
任意多的数字
e/E
+/-
任意数字
json解析的目标,或者说实现的功能
基本的功能
创建json对象
json 对象[数组],插入元素,(默认到最后插入元素)
json 对象[数组]的删除数据,删除元素(默认删除最后的元素)
json对象[数组]打印成json串。递归处理。
json串转换成json对象[数组]
需要考虑的
内存的创建和释放
特殊字符的处理
如果同一个串出现了两次,
其他的功能
封装成php或者python扩展
json解析的测试
功能测试
不宕掉
满足基本的功能目标
性能
大批量的性能测试
概要设计
1 定义json的基础数据结构
2 定义内存的处理函数
3 定义基本的函数
4 新增的函数放在另外一个文档里面
详细的设计思路
基础结构设计
json结构
union BaseValue 存储基础的数据int,double,char*
JsonValue存储:
类型,key,BaseValue,下个数据,孩子数据的节点
内存分配函数
json的链表头,链表尾部
比较函数
一个基础数据的头部----串联所有的基础数据[不包括对象,数组],节省内存空间。
不用重复释放内存
内存的使用
创建函数创建JsonValue
可以通过参数控制
创建BaseValue的权限交给单独的基础数据创建函数
释放内存JsonValue
检测BaseValue 是否为空
检查引用值是否为1
往json或者数组插入数据前先查找基础数据链表---是否存在相同的数据
特殊处理
对于long,double,bool,str考虑用一个列表串起来,存储重复的数据
todo:改进,将上述的链表做成一个链表数组,分别存储这四类数据
todo:改进,将上述的链表做成hash表,实现查找的O(1)操作
重构它的数据结构
需要对基础数据做引用。需要分配内存吗?交给基本的数据分配内存?
想象下以后的内存分配情况
1 创建数据只是单纯的创建数据-不关心基础数据,不分配基础数据的内存
2 基础数据的创建单独分配内存---分配基础数据的内存
3 释放数据需要考虑引用量----检测基础,如果存在,查看引用情况,如果存在引用不释放空间
基本操作
# json value的创建
不是一定创建basevalue
# json value的释放
basevalue为引用,减少数据即可
#创建各种基础数据
null不分配对象,通过
bool创建
int 创建
double 创建
string 创建
#json的值比较
各种基础类型的数据的比较,只比较基础数据
数组
创建空数组
往数组指定的位置插入数据,插入前检测数据是否存在
删除指定位置的数据
数组转换成json串
对象
创建空对象
往对象指定的位置插入数据
删除指定位置的数据
json列表
json列表的插入
json列表的删除
json 基础表的创建,基础表的删除
json 的销毁
json 转换成字符串
字符串转换成json