在Rails中使用数组解析JSON

时间:2013-03-27 21:58:37

标签: ruby-on-rails ruby 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

据我了解,问题是:ruby无法将ActiveSupport::JSON.decode(response.body)["users"]识别为数组,因此puts仅返回第一个用户。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:9)

您粘贴的内容不是有效的JSON。每个"name"之后的逗号是一个问题

"name": "Chris Rivers",

您将LoadError尝试使用ActiveSupport::JSON.decode

解码此问题
  

MultiJson :: LoadError:399:'{“user_id”处的意外标记:1,“name”:“Chris Rivers”,},{“user_id”:3,“name”:“Peter Curley”,}] }“

如果我们清理JSON,将其转换为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"]

答案 1 :(得分:7)

您的源数据在每个用户名后是否实际上都有逗号?我得到了一个解析错误,但如果我删除它们,你的代码就像你想要的那样:

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

答案 2 :(得分:6)

问题不是无法识别数组,而是"name"元素之后的尾随逗号。

删除它们允许JSON解析正常进行:

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