lua解析json
自己写的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"));]]
lua解析json的更多相关文章
- LUA解析json小demo
需要修改的json数据gui-config.json { "configs": [{ "server": "JP3.ISS.TF", &qu ...
- Xamarin.Android下获取与解析JSON
一.新建项目 1.新建一个Android项目,并命名为为NetJsonList 2.右击引用,选择添加引用,引用System.Json.dll 二.同步请求 既然是跨平台,我们自然不能按照java下的 ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- 阶段一:通过网络请求,获得并解析JSON数据(天气应用)
“阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 在上一篇阶段一:解析JSON中提到,最近在写一个很简单的天气预报应用.即使功能很简单,但我还是想把它做成一个相对完 ...
- 阶段一:解析JSON
“阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 最近学到解析JSON格式的网络数据,而作业也要求自己找一个天气预报的API地址,然后解析其中JSON格式的数据.可 ...
- C语言创建及解析Json的使用法则
参考原文:http://blog.csdn.net/xukai871105/article/details/33013455 JSON(JavaScriptObject Notation)是一种轻量级 ...
- 不一样的dynamic解析json 万能方法
写过javascript的人都知道js解析json 1:(JSON) 字符串转换为对象. var str = '{"name":"lsw","hobb ...
- C# 解析JSON的几种办法
欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把. 搜索过程中免不了碰到一大堆名词:WCF => DataContract => ...
- eval解析JSON中的注意点
在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery ...
随机推荐
- 百度地图 Android SDK - 标注(Marker)的基本使用
标注(Marker)是开发人员最常使用的地图覆盖物志一.今天就来向大家介绍一些标注(Marker)的最基本用法! 实现目标: 1.构建基础地图页面: 2.在地图的中心点处加入 Marker: 3.实现 ...
- 不在JPA 的 persistence.xml 文件里配置Entity class的解决的方法
在Spring 集成 Hibernate 的JPA方式中,须要在persistence配置文件里定义每个实体类.这样很地不方便.2种方法能够解决此问题: 这2种方式都能够实现不用在persist ...
- Mismatched locale IDs. The component locale ID (2052) does not match the connection manager locale ID (2057)
Snapshot: When using the 'Flat File Source' and 'OLE DB Destination' or something else components to ...
- selenium从入门到应用 - 1,环境准备(Java+TestNG+Maven+Selenium)
本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境的 ...
- 仿百度壁纸client(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化
仿百度壁纸client(六)--完结篇之Gallery画廊实现壁纸预览已经项目细节优化 百度壁纸系列 仿百度壁纸client(一)--主框架搭建,自己定义Tab + ViewPager + Fragm ...
- 【BIEE】06_UNION /UNION ALL集合中分类汇总求和占比字段特殊处理
环境准备 基于[BIEE]04..中建立的事实表 通过UNION ALL后得到如下报表: 优秀员工薪水公式:CASE WHEN "EMP_FACT"."级别"= ...
- Android 冷兵器 之 tools
代码地址如下:http://www.demodashi.com/demo/12612.html 前言 Android开发在所难免的就是UI的预览和调整,一般情况下都是直接run看效果,或者是使用AS的 ...
- Android事件的分发
1 http://blog.csdn.net/guolin_blog/article/details/9097463 2
- C# 中 finally 的用法
当一个异常抛出时,它会改变程序的执行流程.因此不能保证一个语句结束后,它后面的语句一定会执行,在 C# 中这个问题可以用 finally 解决. 为了确保一个语句总是能执行(不管是否抛出异常),需要将 ...
- nginx 根据参数选择文档根目录
server { listen 80; server_name testmanage.h5.91wan.com; index index.html index.htm ...