1

I am trying to convert existing python function into lua function. But my lua function is not producing same result as python function. Any help is appreciated.

Python function:

import json

test = '{"http://localhost:8080/":{"phone":{"-detail/phone detail.template.html":"5167n,a,7,2","s/motorola-xoom-with-wifi.json":"516a0,5,4,3"},"favicon.ico":"016ad,3,3,2","img/phones/motorola-xoom-with-wi-fi.":{"1.jpg":"*02s,2s,4v,h3|116da,o,l,6","2.jpg":"*02s,2s,4v,kp|116da,j,i,8","3.jpg":"*02s,2s,4v,ob|116da,o,m,8,7,,7,7,7","4.jpg":"*02s,2s,4v,rx|116da,o,m,9,8,,7,7,7","5.jpg":"*02s,2s,4v,vj|116da,p,m,a,8,,7,7,7"}}}'


def tri(param):
  t = {}
  for key in param:
    if key not in param:
        continue
    if isinstance(param[key], dict) and param[key] is not None:
        flat = tri(param[key])
        for x in flat:
            if x not in flat:
                continue
            t[key + x] = flat[x]
    else:
        t[key] = param[key]
return t


print(tri(json.loads(test)))

Lua code ( which is not producing same result as python function)

local json = require('cjson')

local test = '{"http://localhost:8080/":{"phone":{"-detail/phone-detail.template.html":"5167n,a,7,2","s/motorola-xoom-with-wi-fi.json":"516a0,5,4,3"},"favicon.ico":"016ad,3,3,2","img/phones/motorola-xoom-with-wi-fi.":{"1.jpg":"*02s,2s,4v,h3|116da,o,l,6","2.jpg":"*02s,2s,4v,kp|116da,j,i,8","3.jpg":"*02s,2s,4v,ob|116da,o,m,8,7,,7,7,7","4.jpg":"*02s,2s,4v,rx|116da,o,m,9,8,,7,7,7","5.jpg":"*02s,2s,4v,vj|116da,p,m,a,8,,7,7,7"}}}'

local function tri(param)
    t = {}
    for key in pairs(param) do
      if param[key] == nil then end
      if type(param[key]) == "table" then
        flat = tri(param[key])
        for k in pairs(flat) do
            t[key .. k] = flat[k]
        end
      else
        t[key] = param[key]
      end
  end
  return t
end


print(json.encode(tri(json.decode(test))))
1
  • 1
    it would help if you'd tell people what the function is supposed to do and what it does instead... variables should be local wherever possible. just make yourself clear what happens to your table t as it is global whenever you call tri(). Commented May 11, 2017 at 5:44

2 Answers 2

3
local function tri(param)
    t = {}            -- every time we call tri t will be "reset" to an empty table
    for key in pairs(param) do
      if param[key] == nil then end
      if type(param[key]) == "table" then
        flat = tri(param[key])    -- here we call tri, but we still need t!
        for k in pairs(flat) do
            t[key .. k] = flat[k]
        end
      else
        t[key] = param[key]
      end
  end
  return t
end

Making at least t global should solve that problem. But there is also no reason for flat to be global so we make it local too.

local function tri(param)
    local t = {}
    for key in pairs(param) do
      if param[key] == nil then end
      if type(param[key]) == "table" then
        local flat = tri(param[key])
        for k in pairs(flat) do
            t[key .. k] = flat[k]
        end
      else
        t[key] = param[key]
      end
  end
  return t
end
Sign up to request clarification or add additional context in comments.

Comments

1

Your task could be done a bit easier using json.traverse() function from this Lua JSON module.
Traversing lets you perform arbitrary operations with JSON elements on-the-fly.

This code concatenates element's path (for every JSON element except JSON containers: arrays/objects) and uses it as a key for Lua table.

local json = require'json'

local t = {}

local function callback(path, json_type, value)
   if value ~= nil then  -- value == nil for containers (arrays/objects)
      t[table.concat(path)] = value
   end
end

local test = '{"http://localhost:8080/":{"phone":{"-detail/phone detail.template.html":"5167n,a,7,2","s/motorola-xoom-with-wifi.json":"516a0,5,4,3"},"favicon.ico":"016ad,3,3,2","img/phones/motorola-xoom-with-wi-fi.":{"1.jpg":"*02s,2s,4v,h3|116da,o,l,6","2.jpg":"*02s,2s,4v,kp|116da,j,i,8","3.jpg":"*02s,2s,4v,ob|116da,o,m,8,7,,7,7,7","4.jpg":"*02s,2s,4v,rx|116da,o,m,9,8,,7,7,7","5.jpg":"*02s,2s,4v,vj|116da,p,m,a,8,,7,7,7"}}}'

json.traverse(test, callback)

-- Now t == {
--    ["http://localhost:8080/favicon.ico"] = "016ad,3,3,2",
--    ["http://localhost:8080/img/phones/motorola-xoom-with-wi-fi.1.jpg"] = "*02s,2s,4v,h3|116da,o,l,6",
--    ["http://localhost:8080/img/phones/motorola-xoom-with-wi-fi.2.jpg"] = "*02s,2s,4v,kp|116da,j,i,8",
--    ["http://localhost:8080/img/phones/motorola-xoom-with-wi-fi.3.jpg"] = "*02s,2s,4v,ob|116da,o,m,8,7,,7,7,7",
--    ["http://localhost:8080/img/phones/motorola-xoom-with-wi-fi.4.jpg"] = "*02s,2s,4v,rx|116da,o,m,9,8,,7,7,7",
--    ["http://localhost:8080/img/phones/motorola-xoom-with-wi-fi.5.jpg"] = "*02s,2s,4v,vj|116da,p,m,a,8,,7,7,7",
--    ["http://localhost:8080/phone-detail/phone detail.template.html"] = "5167n,a,7,2",
--    ["http://localhost:8080/phones/motorola-xoom-with-wifi.json"] = "516a0,5,4,3"
-- }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.