2017-09-08 2 views
1

Je dois faire une demande get et récupérer des données à partir d'un tableau json, mais je ne sais pas comment extraire un index de tableau spécifique et imprimer sa valeur. Il ne semble y avoir aucune information en ligne à ce sujet non plus.Lua obtenir des données de tableau json avec cURL

local curl = require("lcurl") 

c = curl.easy{ 
    url = 'http://example.com/api/?key=1234', 
    httpheader = { 
     "Content-Type: application/json"; 
    }; 
    writefunction = io.stderr 
    } 
    c:perform() 
c:close() 

Ce retour

[ 
    { 
     "id": "1", 
     "name": "admin" 
    } 
] 

Mais comment puis-je faire imprimer seulement la valeur de name?

Répondre

1

Vous pouvez utiliser une bibliothèque JSON, par exemple, this one.

local json = require'json' 

local function callback(path, json_type, value, pos, pos_last) 
    local elem_path = table.concat(path, '/') -- element's path 
    --print(elem_path, json_type, value, pos, pos_last) 
    if elem_path == "1/name" then -- if current element corresponds to JSON[1].name 
     print(value) 
    end 
end 

local JSON_string = [[ 

[ 
    { 
     "id": "1", 
     "name": "admin" 
    } 
] 

]] 

json.traverse(JSON_string, callback) 

Sortie:

admin 

Une autre solution (plus simple, avec décodage complet de JSON):

local json = require'json' 

local JSON_string = [[ 

[ 
    { 
     "id": "1", 
     "name": "admin" 
    } 
] 

]] 

print(json.decode(JSON_string)[1].name) 
+0

Merci pour votre aide. Ce que je ne comprends pas, c'est comment je stockerais les données de curl dans une variable, comme dans 'c: perform()' imprime tout à la console mais il ne semble pas y avoir une option pour stocker ces données dans une variable? –

+0

@ P.Nick - probablement, 'c: setopt_writefunction (...)' peut aider. –

+1

Façon simple 't = {} c: setopt_writefunction (table.insert, t)' Et après effectuer do 'str = table.concat (t)' – moteus