2017-10-15 4 views
1

ここでやろうとしているのは、csonを使用してjson_bodyをテーブルにデコードしたものです。設定可能な値conf .remove.json、私はかなり近いと感じていますが、まだ動作していません、そして、より良い方法がありますか?テーブルを「深さ」で見つけてからconf.remove.json = I.want.to.removeのように手をつけて安全な方法がありますか?json_table [I] [want] [to] [remove] [this ] =何もないNPEを投げずにnil?ルアが入れ子になっているJson、複数の場合に発生する単一の発生またはリストを削除する

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 

助けていただいたおかげで、これはルアとの最初の1日なので、私はかなり新しいです。

答えて

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)) 
関連する問題