2013-03-27 56 views
6

陣列我具有由遠程服務器返回以下JSON字符串:解析JSON與滑軌

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

我想迭代用戶。

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

據我瞭解,問題是:紅寶石不承認ActiveSupport::JSON.decode(response.body)["users"]作爲數組,因此puts返回我只有第一個用戶。

我該如何解決這個問題?

回答

9

你粘貼的是無效的JSON。後面的逗號每個"name"後一個問題

"name": "Chris Rivers", 

你會得到一個LoadError想如果我們清理JSON與ActiveSupport::JSON.decode

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

解碼此,把它弄成ActiveSupport::JSON.decode可以理解

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

你會看到有沒有問題遍歷每個對象在"users"(下面x是上述JSON字符串)

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

問題不是不能識別陣列,它的"name"元件後尾隨逗號。

刪除那些允許JSON解析正常進行:

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

請問您的源數據實際上有每個用戶的名稱後尾隨逗號?我得到一個解析錯誤,但你的代碼按照你的意願去工作,如果我刪除它們:

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