2013-03-27 15 views
6

Ich habe folgende JSON-String von einem Remote-Server zurückgegeben:Parse JSON mit einem Array in Rails

{ 
    "users": [ 
    { 
     "user_id": 1, 
     "name": "Chris Rivers", 
    }, 
    { 
     "user_id": 3, 
     "name": "Peter Curley", 
    } 
    ] 
} 

Ich möchte die Benutzer iterieren.

ActiveSupport::JSON.decode(response.body)["users"].each do |user| 
    puts user["name"] 
end 

Soweit ich verstehe, das Problem ist: Rubin nicht ActiveSupport::JSON.decode(response.body)["users"] als Array erkennt und somit puts gibt mir nur den ersten Benutzer.

Wie löse ich dieses Problem?

Antwort

9

Was Sie eingefügt haben, ist kein gültiger JSON. Das Komma nach auf jedem "name" ein Problem ist

"name": "Chris Rivers", 

Sie erhalten eine LoadError bekommen versuchen, dies zu dekodieren mit ActiveSupport::JSON.decode

MultiJson::LoadError: 399: unexpected token at '{"user_id": 1,"name": "Chris Rivers",},{"user_id": 3,"name": "Peter Curley",}]}'

Wenn wir die JSON aufzuräumen, es in etwas drehen ActiveSupport::JSON.decode kann verstehen,

"{\"users\": [{\"user_id\": 1,\"name\": \"Chris Rivers\"},{\"user_id\": 3,\"name\": \"Peter Curley\"}]}" 

Sie sehen, gibt es keine Frage über jedes Objekt inIterieren ist(x unten ist die oben JSON String)

[8] pry(main)> ActiveSupport::JSON.decode(x)["users"].map { |user| user["name"] } 
=> ["Chris Rivers", "Peter Curley"] 
6

Das Problem ist nicht das Array nicht zu erkennen, es ist die nachlauf Kommas nach den "name" Elemente.

Entfernen diejenigen ermöglicht Parsing JSON normal fortgesetzt:

pry(main)> ActiveSupport::JSON.decode(s)["users"] 
=> [{"user_id" => 1, "name" => "Chris Rivers"}, 
    {"user_id" => 3, "name" => "Peter Curley"}] 
6

Haben Ihre Quelldaten haben tatsächlich das Hinter Komma nach jedem Namen des Benutzers? Ich bekomme einen Parse-Fehler dafür, aber Ihr Code funktioniert so, wie Sie es wollen, wenn ich sie entferne:

json = '{ "users": [ { "user_id": 1, "name": "Chris Rivers" }, { "user_id": 3, "name": "Peter Curley" } ]}' 
ActiveSupport::JSON.decode(json)["users"].each do |user| 
    puts user["name"] 
end 
json = '{ "users": [ { "user_id": 1, "name": "Chris Rivers" }, { "user_id": 3, "name": "Peter Curley" } ]}' 
ActiveSupport::JSON.decode(json)["users"].each do |user| 
    puts user["name"] 
end