来自JSON的Redis中的Lua

时间:2013-03-30 14:37:26

标签: lua redis servicestack

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

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

关键是“事件:23455”。

使用Lua脚本和ServiceStack.Redis如何提取一个只包含值小于20的值的匿名对象?

所以我想要返回的内容如下:

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

感谢。

更新03/31/2013:

在尝试了所建议的内容后,我现在遇到了一个新问题。 Lua脚本语法错误。

我收到关于“期待'='靠近cjson”的Lua语法错误。这是Lua脚本字符串(在C#中)我正在向Redis提供:

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 个答案:

答案 0 :(得分:1)

您可以使用LuaJSON available on GitHub,也可以尝试this JSON to Lua table parser执行此任务。用法将是这样的(对于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) )