Redis中的Lua从JSON转换

6

我有一个存储在Redis中的JSON字符串列表,大致如下:

[
   { "ID": 25, "DomainID": 23455, "Name": "Stuff", "Value": 23 }, 
   { "ID": 35, "DomainID": 23455, "Name": "Stuff", "Value": 10 }
]

关键字可能是"Event: 23455"之类的。

使用Lua脚本和ServiceStack.Redis,我该如何提取一个匿名对象,其中仅包含值小于20的值?

所以我想要返回的内容应该像这样:

[{ "ID": 35, "Value": 10}]

谢谢。

更新 03/31/2013:

在尝试了建议后,我现在有一个新问题。一个 Lua 脚本语法错误。

我收到了一个关于“在 cjson 附近期望 '=' ”的 Lua 语法错误。这是我正在传输给 Redis 的 Lua 脚本字符串(在 C# 中):

string luaScript = "local tDecoded = cjson.decode(redis.call('GET', KEYS[1]));"
+ "local tFinal = {};"
+ "for iIndex, tValue in ipairs(tDecoded) do"
+ "     if tonumber( tValue.Value ) < 20 then"
+ "        table.insert(tFinal, { ID = tValue.ID, Value = tValue.Value});"
+ "     end"
+ "end"
+ "return cjson.encode(tFinal);";

有没有了解Lua或Redis Lua的专家可以看出可能存在的问题?例如,Lua语法是否正确?

更新于04/02/2013

通过在每行结尾添加\n换行符解决了解析错误,具体如下。

string luaScript = "local tDecoded = redis.call('GET', KEYS[1]);\n"
+ "local tFinal = {};\n"
+ "for iIndex, tValue in ipairs(tDecoded) do\n"
+ "     if tonumber( tValue.Value ) < 20 then\n"
+ "        table.insert(tFinal, { ID = tValue.ID, Value = tValue.Value});\n"
+ "     else\n"
+ "         table.insert(tFinal, { ID = 999, Value = 0});\n"
+ "     end\n"
+ "end\n"
+ "return cjson.encode(tFinal);";

很不幸,这段代码没有出现任何错误,但是在ServiceStack RedisClient中却返回了"{}"或空列表。所以我还没有到达目标,但我已经更接近它了。

1个回答

3
你可以使用 GitHub 上提供的 LuaJSON 或者尝试 这个 JSON 到 Lua 表格解析器 来完成任务。使用方法类似于(对于 GitHub 链接):
local json = require( "json" )  -- or JSON.lua
local tDecoded = json.decode(sJSON)  -- sJSON is the original JSON string

local tFinal = {}

for iIndex, tValue in ipairs( tDecoded ) do
    if tonumber( tValue.Value ) < 20 then
        table.insert( tFinal, { ID = tValue.ID, Value = tValue.Value} )
    end
end

print( json.encode(tFinal) )

17
由于 require 涉及到文件系统交互,因此在 Redis 内部不可用,但是 cjson 库已经加载。 - hobbs
1
事实证明更新后的Lua脚本字符串的问题实际上是缺少行尾。通过添加\n换行符,解析问题消失了。不幸的是,结果还存在一个问题,我只能得到“{}”或一个空列表,所以这里还有其他问题。 - ChrisS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接