阿赵Json工具AzhaoJson的Lua版本

  大家好,我是阿赵。
  之前分享了AzhaoJson的C#版本,这里顺便分享一下Lua的版本:
AzhaoJson.lua:

require "util/jsonParser"

AzhaoJson = {}

--lua table转json字符串
function AzhaoJson.Encode( tab )
	local str = jsonParser.encode(tab)
	return str
end

--json字符串转lua table
function AzhaoJson.Decode( str)
	local tab = jsonParser.parser(tostring(str))
	return tab
end

  由于Lua是弱类型的,所以转换起来很简单,不需要用反射,只需要table转string,或者string转table就行了。所以主要的工具类里面只提供了这两个方法。
  然后实际实现的类是jsonParser.lua:

jsonParser = {};
local this = jsonParser

function jsonParser.parser( str )
	
	this.curPos = 1
	this.orgStr = str
	this.len = string.len(str)
	this.token = this.read_un_space()

	if this.token == "{" then
		this.tab = this.get_obj()
	elseif this.token == "[" then
		this.tab = this.get_array()
	end
	if this.tab~=nil then
		return this.tab
	else
		return nil
	end
end

function jsonParser.read_un_space( )

	if this.curPos>=this.len then
		return ""
	end
	local s = string.sub(this.orgStr,this.curPos,this.curPos)
	this.curPos = this.curPos +1
	while (s == "\n" or s=="\r" or s=="\t" or s== "\\" or s == " ") do
		if this.curPos>=this.len then
			return ""
		end
		s = string.sub(this.orgStr,this.curPos,this.curPos)
		this.curPos = this.curPos +1
	end
	return s
end

function jsonParser.read( )
	if this.curPos>=this.len then
		return ""
	end
	local s = string.sub(this.orgStr,this.curPos,this.curPos)
	this.curPos = this.curPos +1
	while (s == "\n" or s=="\r" or s=="\t" or s == "\\") do
		if this.curPos>=this.len then
			return ""
		end
		s = string.sub(this.orgStr,this.curPos,this.curPos)
		this.curPos = this.curPos +1
	end
	return s
end

function jsonParser.read_str( )
	if this.curPos>=this.len then
		return ""
	end
	local s = string.sub(this.orgStr,this.curPos,this.curPos)
	this.curPos = this.curPos +1

	return s
end

function jsonParser.trim (s) 
	local trimStr = string.gsub(s, "^%s*(.-)%s*$", "%1")
  return trimStr
end 

function jsonParser.is_null(str )
	if str == nil then
		return true
	elseif str =="" then
		return true
	else
		return false
	end
end

function jsonParser.get_obj()
	local jd = {}
	-- jd[type] = "object"
	this.token = this.read_un_space()
	while(this.token~="}" and this.curPos<this.len and this.is_null(this.token) == false) do
		if this.token ~="," then
			local key = this.get_key()
			key = this.trim(key)
			if this.is_null(key) == true then
				break
			end
			local v = this.get_value()
			local numKey = tonumber(key)
			if numKey~=nil then
				jd[numKey] = v
			else
				jd[key] = v
			end
		end
		this.token = this.read_un_space()
	end
	return jd
end

function jsonParser.get_array()
	local list = {}
	this.token = this.read_un_space()

	while(this.token~="]" and this.is_null(this.token) == false) do
		if this.token == "{" then
			table.insert(list,this.get_obj())
		elseif this.token == "[" then
			table.insert(list,this.get_array())
		elseif this.token~="," then
			local arrJd = this.get_final_value()
			if arrJd~=nil then
				table.insert(list,arrJd)
			end
		end
		this.token = this.read_un_space()
	end
	return list
end

function jsonParser.get_key()
	local k = ""

	while(this.token ~=":" and this.token~="}" and this.is_null(this.token)==false) do
		if this.token~="\"" and this.token~="{" then
			k = this.concat(k,this.token)
		end

		this.token = this.read()
	end

	return k
end

function jsonParser.get_value()
	this.token = this.read_un_space()
	if this.token == "{" then
		return this.get_obj()
	elseif this.token == "[" then
		return this.get_array()
	else
		return this.get_final_value()
	end
end

function jsonParser.get_final_value()

	local k = ""
	local t = this.token
	local tl = string.lower(t)
	if t == "\"" then
		local addStr = this.get_string()
		return addStr
	elseif tl == "t" or tl == "f" then
		local addStr = this.get_bool()
		k = this.concat(k,t)
		k = this.concat(k,addStr)
		local b = true
		if string.lower(k) == "false" then
			b = false
		end
		return b
	elseif tl == "n" then
		local addStr = this.get_null()
		k = this.concat(k,t)
		k = this.concat(k,addStr)
		return nil
	else
		k = this.concat(k,t)
		local addStr = this.get_num()
		k = this.concat(k,addStr)
		k = this.trim(k)
		if string.lower(k) == "null" then
			return nil
		end
		if k == "}" or k == "]" then
			this.curPos = curPos -1
			return nil
		end
		return tonumber(k)
	end
	return nil

end

function jsonParser.get_string( )
	local k = ""
	local last  = nil
	this.token = this.read_str()
	while(this.token~="\"" and this.is_null(this.token)==false) do

		if this.token ~= "\\" then
			k = this.concat(k,this.token)				
		end
		this.token = this.read_str()
	end
	if this.token == "}" or this.token == "]" then
		this.curPos = this.curPos -1
	end
	--print("---------get_string------",k)
	return k
end

function jsonParser.get_bool()
	local k = ""
	this.token = this.read()
	while(this.token~="\"" and this.token~="," and this.token~="}" and this.token~="]" and this.is_null(this.token)==false) do
		k = this.concat(k,this.token)
		this.token = this.read()		
	end
	if this.token == "}" or this.token == "]" then
		this.curPos = this.curPos -1
	end
	return k
end

function jsonParser.get_null()
	local k = ""
	this.token = this.read()
	while(this.token~="\"" and this.token~="," and this.token~="}" and this.token~="]" and this.is_null(this.token)==false) do
		k = this.concat(k,this.token)
		this.token = this.read()		
	end
	if this.token == "}" or this.token == "]" then
		this.curPos = this.curPos -1
	end
	return k
end

function jsonParser.get_num( )
	local k = ""
	this.token = this.read()
	while(this.token~="\"" and this.token~="," and this.token~="}" and this.token~="]" and this.is_null(this.token)==false) do
		k = this.concat(k,this.token)
		this.token = this.read()		
	end
	if this.token == "}" or this.token == "]" then
		this.curPos = this.curPos -1
	end
	return k
end

function jsonParser.encode( obj )
	this.tab = obj
	return this.get_field(obj)
end

function jsonParser.get_field(obj)
	if obj == nil then
		return ""
	end
	local str = ""
	local t = type(obj)
	if t== "number" then
		str = tostring(obj)
	elseif t=="string" then
		str = "\""
		str = this.concat(str,tostring(obj))
		str = this.concat(str,"\"")
	elseif t=="boolean" or t=="bool" then
		str = string.lower(tostring(obj))
	else
		str = this.get_obj_str(obj)
	end
	return str
end

function jsonParser.get_obj_str( obj )
	if obj == nil then
		return "null"
	end
	if type(obj) == "function" then
		return "func"
	end
	local key_list = {}
	local v_list = {}
	for k,v in pairs(obj) do
		table.insert(key_list,k)
		table.insert(v_list,v)
	end
	local len = #key_list
	if len <= 0 then
		return "{}"
	end
	local str = "{"

	for i=1,len do
		local k = key_list[i]
		local v = v_list[i]
		str = this.concat(str,this.get_key_str(k))
		str = this.concat(str,":")
		str = this.concat(str,this.get_field(v))
		if i<len then
			str = this.concat(str,",")
		end
	end
	str = this.concat(str,"}")
	return str
end

function jsonParser.get_key_str( k )
	if type(k) == "string" then
		local str = "\""
		str = this.concat(str,tostring(k))
		str = this.concat(str,"\"")
		return str
	else
		return tostring(k)
	end
end

function jsonParser.concat(...)
    local arg = { ... }
    local resut = table.concat(arg);
    return resut;
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/581279.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Paddle OCR v4 微调训练文字识别SVTRNet模型实践

文字识别步骤参考&#xff1a;https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/recognition.md 微调步骤参考:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7.1/doc/doc_ch/finetune.md 训练必要性 原始模型标点符号和括号容易识别不到 数据…

【kettle004】kettle访问本地MySQL数据库并处理数据至execl文件

一直以来想写下基于kettle的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 熟悉、梳理、总结下MySQL关系数据库相关知识体系 3.欢迎批评指正&#xff0c;跪谢一键三连&…

大模型微调:技术迭代与实践指南

在人工智能领域&#xff0c;大模型&#xff08;LLM&#xff09;的微调是一个关键过程&#xff0c;它使模型能够适应特定的任务和数据集。微调是深度学习中用于改进预训练模型性能的重要技术。通过在特定任务的数据集上继续训练&#xff0c;模型的权重被更新以更好地适应该任务。…

揭秘工业大模型:从人工智能小白到技术先锋

工业大模型的五个基本问题 信息化时代&#xff0c;数字化转型成为企业提升营运效率、应对经营风险和提升核心竞争力的重要途径。在此过程中&#xff0c;数据作为一种客观存在的资源&#xff0c;所产生的价值日益凸显。党的十九届四中全会从国家治理体系和治理能力现代化的高度将…

详解Qt绘图机制

Qt框架以其强大的图形界面功能著称&#xff0c;其中绘图机制是构建丰富视觉效果的关键。本文将详细介绍Qt中的绘图机制&#xff0c;包括绘图基础、绘图设备、绘图工具及高级特性&#xff0c;并通过实战C代码示例&#xff0c;带你领略Qt绘图的魅力。 绘图基础 Qt的绘图操作主要…

vs2019 - release版中_DEBUG宏生效的问题

文章目录 vs2019 - release版中_DEBUG宏生效的问题概述笔记总结END vs2019 - release版中_DEBUG宏生效的问题 概述 在加固程序&#xff0c;需要去掉PE的字符串表中和逻辑相关的字符串。 编译成release版后&#xff0c;用IDA看&#xff0c;还是发现有debug版才有的字符串。 那…

gitee关联picgo设置自己的typora_图床

一&#xff1a;去gitee官网创建仓库&#xff1a;typora_图床 1.百度搜索关键字&#xff1a;gitee&#xff0c;进入官网 2.进入gitee登录或者注册自己的账号 3.进入主页后&#xff0c;点击右上方 4.点击新建仓库 5.设置仓库名&#xff1a;typora_图床 6.点击5的创建&#xff0…

<计算机网络自顶向下> Internet Protocol(未完成)

互联网中的网络层 IP数据报格式 ver: 四个比特的版本号&#xff08;IPV4 0100, IPV6 0110&#xff09; headlen&#xff1a;head的长度&#xff08;头部长度字段&#xff08;IHL&#xff09;指定了头部的长度&#xff0c;以32位字&#xff08;4字节&#xff09;为单位计算。这…

echarts实现水滴图

使用echarts实现水滴图 引入依赖&#xff0c;echarts-liquidfill3兼容echarts5; 安装依赖 "echarts": "^5.4.3","echarts-liquidfill": "^3.1.0",npm install echarts-liquidfill3.1.0 -S实现的效果图 构建一个水滴图的页面 <tem…

基于Spring Boot的商务安全邮件收发系统设计与实现

基于Spring Boot的商务安全邮件收发系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 已发送效果图&#xff0c;用户可以对已发送信息…

4.28总结

对部分代码进行了修改&#xff0c;将一些代码封装成方法&#xff0c;实现了头像功能&#xff0c;创建一个本地字节输入流 fileinputSteam 对象&#xff0c;构造方法中绑定读取的数据源&#xff0c;创建一个socket对象&#xff0c;构造方法中绑定服务器的IP地址和端口号使用sock…

Kafka(十二)Streams

目录 Streams1 什么式是流式处理2 流式处理的相关概念2.1 拓扑2.2 时间2.2.1 输入时间2.2.2 输出时间 2.3 状态2.4 流和表2.5 时间窗口2.5.1 测试时间窗口 2.6 处理保证 3 流式处理设计模式3.1 单事件处理3.2 使用本地状态3.3 多阶段处理和重分区3.4 使用外部查找&#xff1a;流…

阿里云操作日记

昨天买了一个超级便宜的阿里云服务器&#xff0c;2核2G&#xff0c;3M固定带宽&#xff0c;40G ESSD Entry云盘&#xff0c;搭载一个简单的系统&#xff0c;就想到了docker轻量级&#xff0c;易于管理 其实docker很好用&#xff0c;第一步就是安装docker 一、docker安装与端口…

Python快速入门1数据类型(需要具有编程基础)

数据类型&#xff1a; Python 3.0版本中常见的数据类型有六种&#xff1a; 不可变数据类型可变数据类型Number&#xff08;数字&#xff09;List&#xff08;列表&#xff09;String&#xff08;字符串&#xff09;Dictionary&#xff08;字典&#xff09;Tuple&#xff08;元…

python学习笔记----循环语句(四)

一、while循环 为什么学习循环语句 循环在程序中同判断一样&#xff0c;也是广泛存在的&#xff0c;是非常多功能实现的基础&#xff1a; 1.1 while循环语法 while 条件表达式:# 循环体# 执行代码这里&#xff0c;“条件表达式”是每次循环开始前都会评估的表达式。如果条件…

张大哥笔记:我付钱了,我就是大爷?

很抱歉用这个当做标题&#xff0c;来给大家分享一些电商的故事&#xff01;大家好&#xff0c;我是张大哥&#xff0c;今天聊聊在电商路上遇到过的奇葩买家&#xff1f; 比如最近我在做PDD的时候&#xff0c;就会遇到很多莫名其妙的sha子&#xff0c;咱是知识份子&#xff0c;肯…

漏洞扫扫工具合集

综合类扫描工具 AWVS Acunetix一款商业的Web漏洞扫描程序&#xff0c;它可以检查Web应用程序中的漏洞&#xff0c;如SQL注入、跨站脚本攻击、身份验证页上的弱口令长度等。它拥有一个操作方便的图形用户界面&#xff0c;并且能够创建专业级的Web站点安全审核报告。新版本集成了…

LeetCode1017题:负二进制转换(原创)

【题目描述】 给你一个整数 n &#xff0c;以二进制字符串的形式返回该整数的 负二进制&#xff08;base -2&#xff09;表示。注意&#xff0c;除非字符串就是 "0"&#xff0c;否则返回的字符串中不能含有前导零。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&…

高频面试题:解决Spring框架中的循环依赖问题

引言&#xff1a;什么是Spring框架与循环依赖&#xff1f; 在Spring框架中&#xff0c;循环依赖是指两个或多个bean相互依赖对方以完成自己的初始化。这种依赖关系形成了一个闭环&#xff0c;导致无法顺利完成依赖注入。比如&#xff0c;如果Bean A在其构造函数中需要Bean B&a…

图像处理:乘法滤波器(Multiplying Filter)和逆FFT位移

一、乘法滤波器&#xff08;Multiplying Filter&#xff09; 乘法滤波器是一种以像素值为权重的滤波器&#xff0c;它通过将滤波器的权重与图像的像素值相乘&#xff0c;来获得滤波后的像素值。具体地&#xff0c;假设乘法滤波器的权重为h(i,j)&#xff0c;图像的像素值为f(m,…
最新文章