用c写一个简单json处理器(一)

用c写一个简单json处理器

json的原理

官网

object
json object

以{开头 }结尾 
基本数据单元是:string:value
基本数据单元用,分隔

array
json array
以[开头 ]结尾
基本数据单元:value
基本数据单元,分隔

value
json value
string number object array true false null
string
json字符说明

是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。
一个字符(character)即一个单独的字符串(character string)。


支持所有的字符串
有如下几种情况是特殊的:    
\" \\ \/ \b \f \n \r \t \u

true/false

null

number

json字符说明

正负号
以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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值