问题描述
我有一个 json 输出,但不幸的是,我无法使用任何 json 库解析它,因为我正在运行我的脚本的设备无法更新。
根据设备型号,我得到的输出略有不同(注意冒号前的空格):
json_output1='{ "var1" : "result1","var2" : "result2","var3" : "result3","var4" : "10" }'
or
json_output2='{ "var1": "result1","var2": "result2","var3": "result3","var4": "10" }'
我找到了一种方法来将其解析为字符串,使用 string:match() 和 regex 像这样
var1,var2,var3,var4 = json_ouptut1:match('.+"var1" : "([^"]+)"'
.. '.+"var2" : "([^"]+)"'
.. '.+"var3" : "([^"]+)"'
.. '.+"var4" : "([^"]+)"')
print(var2)
--[[ OUTOUT
$lua main.lua
result2
--]]
这项工作,我很满意,但它只适用于一个或另一个输出,因为冒号前有空格。
知道如何让这对任一字符串起作用吗?
谢谢
解决方法
您可以使用 %s?
来允许模式查找 1 或 0 个空格。
json_output1='{ "var1" : "result1","var2" : "result2","var3" : "result3","var4" : "10" }'
json_output2='{ "var1": "result1","var2": "result2","var3": "result3","var4": "10" }'
var1,var2,var3,var4 = json_output1:match('.+"var1"%s?: "([^"]+)"'
.. '.+"var2"%s?: "([^"]+)"'
.. '.+"var3"%s?: "([^"]+)"'
.. '.+"var4"%s?: "([^"]+)"')
print(var2)
var1,var4 = json_output2:match('.+"var1"%s?: "([^"]+)"'
.. '.+"var2"%s?: "([^"]+)"'
.. '.+"var3"%s?: "([^"]+)"'
.. '.+"var4"%s?: "([^"]+)"')
print(var2)
这里有一个很好的 Lua 模式信息资源:Understanding Lua Patterns
,试试这个代码。它适用于两个输入。根据需要进行调整。
for k,v in json_output:gmatch('"(.-)"%s*:%s*"(.-)"') do
print(k,v)
end
这里的关键是使用 %s*
跳过任何空白运行,甚至是空白运行。