lua中json和table的互轉,是我們在平時開發過程中經常用到的。比如: 在用lua編寫的伺服器中,如果客戶端發送json格式的數據,那麼在lua處理業務邏輯的時候,必然需要轉換成lua自己的數據結構,如table。此時,就會用到table和json格式的互轉。 在用lua編寫的伺服器中,如果我 ...
lua中json和table的互轉,是我們在平時開發過程中經常用到的。比如:
- 在用lua編寫的伺服器中,如果客戶端發送json格式的數據,那麼在lua處理業務邏輯的時候,必然需要轉換成lua自己的數據結構,如table。此時,就會用到table和json格式的互轉。
- 在用lua編寫的伺服器中,如果我們通過redis來存儲數據,由於redis中不存在table這種數據結構,因此,我們可以選擇將table轉換成json字元串來進行存儲。在數據的存取過程中,也會用到table和json格式的互轉。
以上兩種場景中,json和table的互轉使用頻率是非常高的,如果轉換效率有提升,對於降低我們業務延時將會有很大的幫助。因此,選擇一種高效率的轉換方式的重要性可見一斑。
下麵我們簡單介紹兩種轉換方式,並對他們的轉換效率做一個對比。
- 第一種是用lua實現的json和table互轉方式,這種比較常見,需要瞭解使用方法及源碼,請訪問該項目在github上的源碼。
- 第二種叫cjson,是用C實現的。redis中的eval命令支持lua操作資料庫,因此,cjson也在redis中得到使用,我們可以redis的源碼庫中拉倒cjson的源碼。
local t = { a = "hello", b = "world", c = 123456, d = "123456", e = {"hhh", "11", "22"}, f = { a = "hello", b = "world", c = 123456, d = "123456", e = {"hhh", "11", "22"}, count = 0 } } local tm1 = os.time() local str_json = "" for i = 1, 50000, 1 do --str_json = json.encode(t) --t = json.decode(str_json) str_json = cjson.encode(t) t = cjson.decode(str_json) t.f.count = t.f.count + 1 end local tm2 = os.time() print("tm1:" .. tm1 .. ",tm2:" .. tm2 .. ",dt:" .. (tm2 - tm1)) print(str_json)結果1:使用json轉換後的輸出,耗時為51秒。
tm1:1575363384,tm2:1575363435,dt:51 {"a":"hello","c":123456,"b":"world","e":["hhh","11","22"],"d":"123456","f":{"a":"hello","c":123456,"b":"world","e":["hhh","11","22"],"d":"123456","count":49999}}結果2:使用cjson轉換後輸出,耗時為5秒。
tm1:1575363457,tm2:1575363462,dt:5 {"a":"hello","c":123456,"b":"world","e":["hhh","11","22"],"d":"123456","f":{"a":"hello","c":123456,"b":"world","e":["hhh","11","22"],"d":"123456","count":49999}}結論: 通過上面的實驗,可以看到,通過cjson的轉換效率基本是通過lua實現的json.encode()和json.decode()的10倍。