6

我有远程服务器返回的以下 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只返回第一个用户。

我该如何解决这个问题?

4

3 回答 3

10

您粘贴的不是有效的 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"]
于 2013-03-27T22:06:45.580 回答
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
于 2013-03-27T22:07:31.660 回答
6

"name"问题不在于无法识别数组,而在于元素后面的逗号。

删除这些允许 JSON 解析正常进行:

pry(main)> ActiveSupport::JSON.decode(s)["users"]
=> [{"user_id" => 1, "name" => "Chris Rivers"},
    {"user_id" => 3, "name" => "Peter Curley"}]
于 2013-03-27T22:06:55.267 回答