通过 Sulfur.wiki 可快速访问本维基!
本WIKI编辑权限开放,欢迎收藏起来防止迷路,也希望有爱的小伙伴和我们一起编辑哟~
编辑帮助:目录 • BWIKI反馈留言板
通过 Sulfur.wiki 可快速访问本维基!
本WIKI编辑权限开放,欢迎收藏起来防止迷路,也希望有爱的小伙伴和我们一起编辑哟~
模块:JSONFetcher/沙盒2
此模块的文档可以在模块:JSONFetcher/沙盒2/doc创建
local p = {}
local dataCache = nil -- 缓存数据
local flatData = nil -- 扁平化数据缓存
-- 获取 Lua 表数据,并缓存
function p.getData(frame)
if dataCache then
return dataCache -- 如果缓存中有数据,直接返回
end
local luaPage = '模块:JSONFetcher/data' -- 数据页面路径
local content = mw.title.new(luaPage):getContent()
if not content then
return "无法获取数据"
end
-- 使用 mw.loadData 来加载 Lua 表
local data, err = mw.loadData(content)
if not data then
return "数据格式错误: " .. err
end
-- 缓存数据
dataCache = data
-- 扁平化数据
flatData = {}
local function flattenTable(data, prefix)
for k, v in pairs(data) do
local newKey = prefix .. (type(k) == "number" and "[" .. k .. "]" or "." .. k)
if type(v) == "table" then
flattenTable(v, newKey) -- 递归扁平化
else
flatData[newKey] = v
end
end
end
flattenTable(data, "") -- 扁平化数据
return data
end
-- 获取嵌套值,支持 ! 分隔符和数组索引
function p.fetch(frame)
-- 获取调用参数
local key = frame.args[1]
local data = p.getData(frame)
if type(data) == "string" then
return data -- 如果出错,直接返回错误信息
end
if not key then
return "未指定参数"
end
-- 生成扁平化后的键
local flatKey = key:gsub("!", ".")
-- 查找扁平化后的数据
local value = flatData[flatKey]
if value == nil then
return nil
end
-- 生成返回值
local result
if type(value) == "table" then
local keys = {}
for k, _ in pairs(value) do
if not tostring(k):match("^%?_") then
table.insert(keys, k)
end
end
result = table.concat(keys, ", ")
else
result = tostring(value)
end
return result
end
return p