在Rails中解析带有数组的JSON

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仅返回第一个用户。
如何解决这个问题?
3个回答

10

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

"name": "Chris Rivers",

使用ActiveSupport::JSON.decode尝试解码时,您将会遇到一个LoadError

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"]

8

您的源数据中每个用户名后面是否实际上都有尾随逗号?如果有,那么我会因此得到一个解析错误,但是如果我将它们删除,则您的代码可以按照您想要的方式正常工作:

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

6
问题不在于未认出数组,而是在"name"元素后面的尾逗号。
去掉这些逗号可以使JSON解析正常进行:
pry(main)> ActiveSupport::JSON.decode(s)["users"]
=> [{"user_id" => 1, "name" => "Chris Rivers"},
    {"user_id" => 3, "name" => "Peter Curley"}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接