> > 技术-博客 > Siney:Json4Lua 的一个Bug
 

Siney:Json4Lua 的一个Bug

2011-01-26 15:39:56
 

项目里要使用json作为http请求的返回内容, 于是google找到这个json4lua, 貌似也是唯一一个用lua原生实现的json解析库, 下载最新版使用, 但在实际使用中发现了一个bug, 这就是无法解析空的数组内容, 如下:

local str=json.encode({1,2,3,{}})

#str="[1,2,3,[]]"

json.decode(str) # raise a error

这样会触发一个脚本错误, 具体就是当解析完"["符号后, 不能紧接着"]"符号, 我不知道具体json标准是否允许空的数组内容, 但代码中str是由json.encode函数自己返回,自己再decode就会失败, 同样的代码, 我在python中尝试json是没有问题, 再去google发现没有人遇到同样的问题, 看来用lua处理json的人很少啊, 看来只能自己动手了, 解决之, 具体如下修改:

– a value, pretty similar to tt_object_value
    init_token_table (tt_array_seperator) "array ({ or [ or ' or " or number or boolean or null expected)"
        :link(tt_object_key)         :to "{"
        :link(tt_array_seperator)    :to "["
        :link(true)                            :to "]"  # 加入这行
        :link(tt_singlequote_string) :to "’"
        :link(tt_doublequote_string) :to ‘"’ 
        :link(tt_comment_start)      :to "/"
        :link(tt_numeric)            :to "0123456789.-"
        :link(tt_boolean)            :to "tf"
        :link(tt_null)               :to "n"
        :link(tt_ignore)             :to " trn"

 

函数read_array修改为:

– read arrays, empty array expected as o arg
        function read_array (o,i)
            –if not i then status "arr open" end
            i = i or 1
            — loop until …
            while true do
                local t = next_token(tt_array_seperator)
                if t == true then
                    return o
                else
                    o[i] = read_value(t,tt_array_seperator)
                    t = next_token(tt_array_value)
                    if t == tt_comment_start then
                        t = read_comment(tt_array_value)
                    end
                    if t == true then  — … we found a terminator token
                        –status "arr close"
                        return o
                    end
                    i = i + 1
                end
            end
        end

解决后本来想发mail给原作者, 但怎么也找不到其电子邮件, json4lua的官方站点也很冷清的样子, forum内就一条留言, 就此作罢.

 
相关话题推荐
 
相关新闻:
发贴区
  评论仅表达个人看法,并不表明爱酷游同意其观点或证实其描述。
   
icoou资讯76小时热门排行
icoou人气图片推荐
酷友推荐
焦点推荐
24小时前沿动态
标题  
点击数 
主题推荐

话题推荐
视频专题

娱乐专题