Lua嵌套Json,删除单个发生或如果多个发生列表

时间:2017-10-15 00:18:19

标签: json lua cjson

所以我在这里尝试做的是给定的json_body,使用cjson将json解码为一个表我希望通过可配置的值conf.remove.json删除给定的元素,我觉得我很接近但是它的仍然没有工作,有更好的方法吗?是否有一种安全的方法来找到表格"深度"然后像conf.remove.json = I.want.to.remove.this一样伸出手来创建行为json_table [I] [想要] [到] [删除] [这个] = nil而不抛出某种NPE?

local configRemovePath= {}
local configRemoveDepth= 0
local recursiveCounter = 1

local function splitString(inputstr)
        sep = "%."  --Split on .
        configRemovePath={} 
        configRemoveDepth=0 

            for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
                configRemovePath[configRemoveDepth + 1] = str
                configRemoveDepth = configRemoveDepth + 1
        end
end

local function recursiveSearchAndNullify(jsonTable)
  for key, value in pairs(jsonTable) do --unordered search
    -- First iteration
    --Sample Json below, where conf.remove.json = data.id and nothing happened. conf.remove.json=data.id
    --{
    --"data": {
      --  "d": 2, 
     --   "id": 1
    --}
        --}
    -- value = {"d": 2, "id": 1}, key = "data", configRemovePath[recursiveCounter] = "data" , configRemovePath ['data','id'] , configRemoveDepth = 2

    if(type(value) == "table" and value == configRemovePath[recursiveCounter]  and recursiveCounter < configRemoveDepth) then --If the type is table, the current table is one we need to dive into, and we have not exceeded the configurations remove depth level
      recursiveCounter = recursiveCounter + 1  
      jsonTable = recursiveSearchAndNullify(value)
    else
      if(key == configRemovePath[recursiveCounter] and recursiveCounter == configRemoveDepth) then --We are at the depth to remove and the key matches then we delete. 
          for key in pairs (jsonTable) do --Remove all occurances of said element
                jsonTable[key] = nil
                end
      end
    end
  end
  return jsonTable
end

for _, name in iter(conf.remove.json) do
  splitString(name)
  if(configRemoveDepth == 0) then
      for name in pairs (json_body) do
            json_body[name] = nil
            end
  else
    recursiveCounter = 1 --Reset to 1 for each for call
    json_body = recursiveSearchAndNullify(json_body)
  end
end

感谢任何协助的人,这是我与Lua的第一天,所以我很新闻。

1 个答案:

答案 0 :(得分:0)

这是官方的答案,在Christian Sciberras的帮助下找到了更好的方法!

local json_body_test_one = {data = { id = {"a", "b"},d = "2" }} --decoded json w cjson
local json_body_test_two = {data = { { id = "a", d = "1" }, { id = "b", d = "2" } } }
local config_json_remove = "data.id"

local function dump(o) --Method to print test tables for debugging
   if type(o) == 'table' then
      local s = '{ '
      for k,v in pairs(o) do
         if type(k) ~= 'number' then k = '"'..k..'"' end
         s = s .. '['..k..'] = ' .. dump(v) .. ','
      end
      return s .. '} '
   else
      return tostring(o)
   end
end

local function splitstring(inputstr, sep)
  if sep == nil then
    sep = "%." --Dot notation default
  end
  local t={} ; i=1
  for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
    t[i] = str
    i = i + 1
  end
  return t
end

local function setjsonprop(json_object, path, newvalue)
  local configarray = splitstring(path)
  while (#configarray > 1) do
    json_object = json_object[table.remove(configarray, 1)]
    if(type(json_object) == "table" and #json_object > 0) then
      local recursepath = table.concat(configarray, ".")
        for _, item in pairs(json_object) do
          setjsonprop(item, recursepath, newvalue)
        end
        return
    end
  end

  json_object[table.remove(configarray, 1)] = newvalue
end

setjsonprop(json_body_test_one, config_json_remove, nil)
print(dump(json_body_test_one))
相关问题