2014-07-08 21 views
2

我試圖將保存的Lua錶轉換爲我可以更容易地解析以包含在網頁中的東西。我使用的是來自code.google's luaforwindows的windows的Lua。它包含在這個harningt's luajson中用於處理這種轉換。我已經能夠弄清楚如何加載文件的內容。我沒有得到任何錯誤,但它產生的「json」是無效的。它只是將整個東西放在引號中,並添加了\n\t。我讀的文件是一個.lua文件,該文件的格式爲:刪除luajson輸出中的新行和標籤

MyBorrowedData = { 
    ["first"] = { 
     ["firstSub"] = { 
      ["firstSubSub"] = { 
       { 
        ["stuffHere"]="someVal" 
       }, 
       { 
        ["stuffHere2"]="some2Val" 
       }, 
      }, 
     }, 
    }, 
} 

注意,以下各表的「行」的最後一個項目,是這個問題?它有效的Lua數據?我感覺就像給出了輸出結果,當我讀入時,Lua無法解析表格。當我嘗試使用lua數據文件的require時,我更加相信這一點,而且我似乎無法手動遍歷表格。

任何人都可以告訴我,如果它是代碼中的錯誤或格式不正確的數據導致該問題?

的Lua的提升很簡單:

local json = require("json") 
local file = "myBorrowedData.lua" 
local jsonOutput = "myBorrowedOutput.json" 

r = io.input(file) 
t = io.read('*all') 
u = io.output(jsonOutput) 
s = json.encode(t) 
io.write(s) 

回答

3

您正在閱讀的文件爲純文本,而不是加載包含它裏面的Lua代碼。 t成爲一個帶有Lua文件內容的字符串,當然這些字符序列化爲一個普通的JSON字符串。

要序列化Lua文件中的數據,您需要運行它。

local func = loadstring(lua_code_string) -- Load Lua code from string 
local data = {} -- Create table to store data 
setfenv(func, data) -- Set the loaded function's environment, so any global writes that func does will go to the data table instead. 
func() -- Run the loaded function. 

local serialized_out = json.encode(data) 

此外,以逗號(或分號)結束表格的最後一項是完全有效的語法。事實上,我推薦它;向表中添加新項目時,不必擔心向前一個對象添加逗號。

+0

當我發佈了這個問題後,我把我的代碼粘貼到lua文件的底部,它工作,所以我有一種感覺,我沒有正確加載數據。我必須找出答案的執行情況,但一旦我做到了,BOOM就會成功!非常感謝你。 如果有人有興趣,我把代碼放在我最初的t var之後,並將他的lua_code_string改爲我的t var。 s var被改爲json.encode(data)。 –

+0

@AndyFoster請考慮使用更多的描述性變量名稱。對於更多按鍵的成本,您可以讓其他人(例如SO)和您自己更容易理解您的代碼。 –

+0

會這麼做,我一直都在做JS,我不知道爲什麼我在櫻桃採摘時沒有改變它們。 –