我有一个远程服务器返回的以下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
仅返回第一个用户。
我该如何解决这个问题?
答案 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"}]