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 に答える