2013-03-25 3 views
2

Я знаю, что это действительно странный вопрос, но у меня есть этот тип строкстрока таблицы

local string_1 = "{ [name] = "string_1", [color] = "red" }" 
local string_2 = "{ [name] = "string_2", [color] = "blue" }" 
local string_3 = "{ [name] = "string_3", [color] = "green" }" 

Могу ли я использовать table.insert или что-то, чтобы превратить их в этот

local table_1 = { 
    { [name] = "string_1", [color] = "red" }; 
    { [name] = "string_2", [color] = "blue" }; 
    { [name] = "string_3", [color] = "green" }; 
} 
+1

Я полагаю, что строки на самом деле что-то вроде ' "{[имя] = \" STRING_1 \ " [цвет] = \" красный \ "}" '? –

+1

Кроме того, вы имели в виду, что ключи были ссылками на переменные 'name' и' color', а не на строки 'name' и' color'? –

ответ

0

Мне кажется, что у вас есть строки JSON, которые вам нужно проанализировать. Это можно сделать, используя LuaJSON или other ...

2

Эти строки выглядят как код Lua. Предполагая, что формат этих строк исправлен, т. Е. Вы не можете выбрать JSON или какое-либо другое представление, тогда правильная вещь, вероятно, просто загрузить их как код Lua и выполнить их. Вероятно, вы захотите изолировать код, в зависимости от того, откуда взялись эти строки.

Способ для этого отличается от Lua 5.1 и Lua 5.2. Какую версию вы используете?


Вот пример этого в Lua 5.1. Я предполагаю, что ваш образец ввода на самом деле не тот, который вы намеревались, и что name и color должны были быть строковыми ключами, а не ссылками на переменные. Если они являются переменными, вам нужно будет отключиться от среды.

local strings = { 
    "{ name = \"string_1\", color = \"red\" }", 
    "{ name = \"string_1\", color = \"red\" }", 
    "{ name = \"string_3\", color = \"green\" }" 
} 

-- parses a string that represents a Lua table and returns the table 
local function parseString(str) 
    local chunk = loadstring("return " .. str) 
    -- Sandbox the function. Does it need any environment at all? 
    -- Sample input doesn't need an environment. Let's make it {} for now. 
    setfenv(chunk, {}) 
    return chunk() 
end 

local tables = {} 
for _, str in ipairs(strings) do 
    table.insert(tables, parseString(str)) 
end 
0

Это работает в обоих Lua 5,1 & 5,2

local string_1 = '{ [name] = "string_1", [color] = "red" }' 
local string_2 = '{ [name] = "string_2", [color] = "blue" }' 
local string_3 = '{ [name] = "string_3", [color] = "green" }' 

local function str2tbl(str) 
    return assert((loadstring or load)('return '..str:gsub('%[(.-)]','["%1"]')))() 
end 

local table_1 = {} 
table.insert(table_1, str2tbl(string_1)) 
table.insert(table_1, str2tbl(string_2)) 
table.insert(table_1, str2tbl(string_3)) 
+1

В зависимости от источника этих строк это может быть довольно опасно, поскольку вы не песочница. –

+0

Кроме того, это не работает в Lua 5.1. 'load()' не может принимать строку. –

+0

@KevinBallard - Спасибо. Исправлена. –

Смежные вопросы