Lua生成Json

2884 ワード

[size=medium]JSON形式の文字列をLuaで扱うことが多いので、Luaの中のtableからJSON形式の文字列を生成する方法を書きました.車輪を再構築するのは嫌ですが、自分で書いたこの小段のコードは仕事の中でもっと実用的です(実は主な原因は私が他の人の書いたコードを読めないことです:oops:):[/size]
function table2json(t)
local function serialize(tbl)
local tmp = {}
for k, v in pairs(tbl) do
local k_type = type(k)
local v_type = type(v)
local key = (k_type == "string" and "\"" .. k .. "\":")
or (k_type == "number" and "")
local value = (v_type == "table" and serialize(v))
or (v_type == "boolean" and tostring(v))
or (v_type == "string" and "\"" .. v .. "\"")
or (v_type == "number" and v)
tmp[#tmp + 1] = key and value and tostring(key) .. tostring(value) or nil
end
if table.maxn(tbl) == 0 then
return "{" .. table.concat(tmp, ",") .. "}"
else
return "[" .. table.concat(tmp, ",") .. "]"
end
end
assert(type(t) == "table")
return serialize(t)
end

[size=medium]Lua tableのkeyとvalueの中にJSON構文に合致しないデータ型が現れた場合、13行目のコードはこれらの非合法なkey-value対を無視することができ、最終的に生成されたJSON文字列には現れない.[/size]
[size=medium]呼び出し:[/size]

table1 = {
test1 = {
"test1", "test2", "test3", true, false,
},
test2 = "bbb",
test3 = {
table2 = {
a = "a",
ttt= {
1, 2, 3, {4, 5, 6, },
},
b = "b",
c = {},
},
[true] = 999,
},
[{}] = 34545,
}

print(table2json(table1))

[size=medium]出力:[/size]
[quote]
{"test3":{"table2":{"a":"a","c":{},"b":"b","ttt":[1,2,3,[4,5,6]]}},"test1":["test1","test2","test3",true,false],"test2":"bbb"}
[/quote]
[size=medium]
[true]=999,[{}]=34545の2つのJSONに変換できないkey-valueが生成したJSON文字列でフィルタリングされていることがわかる.
残念なことに、Luaの文法特性のため、この方法はLuaの中のnilをJSONの中のnullに転化することができなくて、良い方法を考えてから言えば、今のところこのような需要も存在する必要はありませんので、今も十分です:oops:
以上のコードを少し修正して、Lua tableのシーケンス化を実現することもできます:D[/size]