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}]

ありがとう。

2013 年 3 月 31 日更新:

提案されたことを試した後、新しい問題が発生しました。Lua スクリプトの構文エラーです。

"expecting '=' near 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 の構文は正しいように見えますか?

2013 年 4 月 2 日更新

このように各行の末尾に \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 に「{}」または空のリストしか返されません。だから私はまだそこにいませんが、一歩近づいています.

4

1 に答える 1

2

GitHub で利用可能な LuaJSONを使用するか、この JSON to 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) )
于 2013-03-31T04:24:24.047 に答える