SBJson解析

先了解下Json基本格式:(图片来自http://www.json.org)
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这几张图一目了然,把json格式概括的很好。
下面看看SBJson解析:
两个问题:
1. 怎么解析string类型和NSNumber类型
2. 怎么将数据从返回的数据流中解析为字典和数组等类型

解析string时:从”开始往后,遇到”停止返回;遇到0~0xif(ASCII表0-31)停止报错;遇到\将后面的”,,/和一些控制字符或者unicode编码解析出来,然后继续直到”停止。
解析NSNumber时:遇到-用标记标记其为负数,从左至右*10累加得到数值,遇到.用exponent表示指数,即小数点的位置;遇到e或E*10累加得到E后的指数explicit_exponent,然后和exponent想加减得到最终指数,最后得到数值。

将json数据读入,然后逐个字符判断,标记其状态

[       sbjson_token_array_start
]       sbjson_token_array_end
{       sbjson_token_object_start
}       sbjson_token_object_end
:       sbjson_token_keyval_separator
,       sbjson_token_separator
null    sbjson_token_null
true    sbjson_token_true
false   sbjson_token_false
“       取出后面的string,返回sbjson_token_string
-/09   取出数字,返回sbjson_token_number
+       错误sbjson_token_error

用到3个栈:
1.stack:保存解析后的数据
2.keystack:临时保存解析时的key值
3.stateStack:保存StateArrayStart->‘[’ StateObjectStart->‘{’ 和原始状态值,用来记录嵌套的深度,默认的深度安全值是32,嵌套深度超过安全值就会报错,也可以设置不需要安全值。

解析过程:
遇到[新建array并入stack栈,array_start入statestack栈
遇到{新建dict并入stack栈,object_start入statestack
遇到”将其后的字符串取出,根据状态判断是否需要缺少key,是则入keystack栈。如果不缺少key则处理当前值,根据状态判断当前是数组还是字典,如果是数组,则将值加到当前数组中,如果是对象则从keystack中取出key值与当前值组成一对键值对加到当前object中。
遇到 : , 跳过。
遇到数字,获取整个数字,判断是数组还是字典,是字典则从keystack将顶部pop出作为与当前数字组合成一个键值对放入字典;是数组则将值加入到当前数组中。
true false 以及null的处理和数字处理类似。
遇到}说明字典结束,将statestack栈顶元素弹出,将statestack弹出的目的是实时更新栈的深度。将stack栈顶元素弹出并加入到当前栈顶元素之中(向上一层级合并)
遇到]说明数组结束,将statestack栈顶弹出,将stack栈顶弹出,并加入到上一级,即当前stack栈顶元素。
当stack栈空的时候,最后弹出的就是我们解析的结果。
例子:
[
{
“CityId”:18
}
]
这里写图片描述

最后从网上找了一份各个json库的解析效率对比,仅供参考。
这里写图片描述
图片出处:http://blog.csdn.net/arthurchenjs/article/details/7009995

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值