• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

lua解析json

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

自己写的lua解析json,带容错,如果要是用于格式检查,得修改下。很简单直接贴代码

--------------------------------------------------json解析----------------------------------------------------------
local function json2true(str,from,to)
    return true, from+3
end

local function json2false(str,from,to)
    return false, from+4
end

local function json2null(str, from, to)
    return nil, from+3
end

local function json2nan(str, from, to)
    return nul, from+2
end

local numberchars = {
    ['-'] = true,
    ['+'] = true,
    ['.'] = true,
    ['0'] = true,
    ['1'] = true,
    ['2'] = true,
    ['3'] = true,
    ['4'] = true,
    ['5'] = true,
    ['6'] = true,
    ['7'] = true,
    ['8'] = true,
    ['9'] = true,
}

local function json2number(str,from,to)
    local i = from+1
    while(i<=to) do
        local char = string.sub(str, i, i)
        if not numberchars[char] then
            break
        end
        i = i + 1
    end
    local num = tonumber(string.sub(str, from, i-1))
    if not num then
        error(_format('json格式错误,不正确的数字, 错误位置:{from}', from))
    end
    return num, i-1
end

local function json2string(str,from,to)
    local ignor = false
    for i = from+1, to do
        local char = string.sub(str, i, i)
        if not ignor then
            if char == '\"' then
                return string.sub(str, from+1, i-1), i
            elseif char == '\\' then
                ignor = true
            end
        else
            ignor = false
        end
    end
    error(_format('json格式错误,字符串没有找到结尾, 错误位置:{from}', from))
end

local function json2array(str,from,to)
    local result = {}
    from = from or 1
    local pos = from+1
    local to = to or string.len(str)
    while(pos<=to) do
        local char = string.sub(str, pos, pos)
        if char == '\"' then
            result[#result+1], pos = json2string(str,pos,to)
--[[    elseif char == ' ' then
        
        elseif char == ':' then
            
        elseif char == ',' then]]
        elseif char == '[' then
            result[#result+1], pos = json2array(str,pos,to)
        elseif char == '{' then
            result[#result+1], pos = json2table(str,pos,to)
        elseif char == ']' then
            return result, pos
        elseif (char=='f' or char=='F') then
            result[#result+1], pos = json2false(str,pos,to)
        elseif (char=='t' or char=='T') then
            result[#result+1], pos = json2true(str,pos,to)
        elseif (char=='n') then
            result[#result+1], pos = json2null(str,pos,to)
        elseif (char=='N') then
            result[#result+1], pos = json2nan(str,pos,to)
        elseif numberchars[char] then
            result[#result+1], pos = json2number(str,pos,to)
        end
        pos = pos + 1
    end
    error(_format('json格式错误,表没有找到结尾, 错误位置:{from}', from))
end

function _G.json2table(str,from,to)
    local result = {}
    from = from or 1
    local pos = from+1
    local to = to or string.len(str)
    local key
    while(pos<=to) do
        local char = string.sub(str, pos, pos)
        if char == '\"' then
            if not key then
                key, pos = json2string(str,pos,to)
            else
                result[key], pos = json2string(str,pos,to)
                key = nil
            end
--[[    elseif char == ' ' then
        
        elseif char == ':' then
            
        elseif char == ',' then]]
        elseif char == '[' then
            if not key then
                key, pos = json2array(str,pos,to)
            else
                result[key], pos = json2array(str,pos,to)
                key = nil
            end
        elseif char == '{' then
            if not key then
                key, pos = json2table(str,pos,to)
            else
                result[key], pos = json2table(str,pos,to)
                key = nil
            end
        elseif char == '}' then
            return result, pos
        elseif (char=='f' or char=='F') then
            result[key], pos = json2false(str,pos,to)
            key = nil
        elseif (char=='t' or char=='T') then
            result[key], pos = json2true(str,pos,to)
            key = nil
        elseif (char=='n') then
            result[key], pos = json2null(str,pos,to)
            key = nil
        elseif (char=='N') then
            result[key], pos = json2nan(str,pos,to)
            key = nil
        elseif numberchars[char] then
            if not key then
                key, pos = json2number(str,pos,to)
            else
                result[key], pos = json2number(str,pos,to)
                key = nil
            end
        end
        pos = pos + 1
    end
    error(_format('json格式错误,表没有找到结尾, 错误位置:{from}', from))
end

--json格式中表示字符串不能使用单引号
local jsonfuncs={
    ['\"']=json2string,
    ['[']=json2array,
    ['{']=json2table,
    ['f']=json2false,
    ['F']=json2false,
    ['t']=json2true,
    ['T']=json2true,
}

function _G.json2lua(str)
    local char = string.sub(str, 1, 1)
    local func=jsonfuncs[char]
    if func then
        return func(str, 1, string.len(str))
    end
    if numberchars[char] then
        return json2number(str, 1, string.len(str))
    end
end

--[[
-----test-------
print("test json2lua");
dump(json2lua("false"));
dump(json2lua("true"));
dump(json2lua("{\"abc\":\"fge\"}"));
dump(json2lua("[\"afv\", 1, \"drrg\", false]"));
dump(json2lua("1234"));
dump(json2lua("null"));]]


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
openresty+lua4、openrestykafka发布时间:2022-07-22
下一篇:
第二章 Lua数值发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap