2017-10-15 4 views
1

Donc, ce que j'essaie de faire ici est pour un json_body donné qui est décodé json dans une table en utilisant cjson Je veux supprimer un élément donné par une valeur configurable conf .remove.json, je pense que je suis assez proche mais ça ne marche toujours pas, et y at-il un meilleur moyen? Y at-il un moyen sûr de trouver les tables "profondeur", puis tendre la main comme conf.remove.json = I.want.to.remove.this crée le comportement json_table [I] [vouloir] [à] [supprimer] [this ] = zéro sans lancer une sorte de NPE?Lua imbriqué JSON, supprimer un seul se produit ou une liste de se produit si plusieurs

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 

Merci à tous ceux qui aident, c'est mon premier jour avec Lua, donc je suis assez nouveau.

Répondre

0

Ceci est la réponse officielle, trouvé une meilleure façon avec l'aide de 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))