Pregunta Parse JSON con una matriz en Rails


Tengo la siguiente cadena JSON devuelta por un servidor remoto:

{
  "users": [
    {
      "user_id": 1,
      "name": "Chris Rivers",
    },
    {
      "user_id": 3,
      "name": "Peter Curley",
    }
  ]
}

Me gustaría iterar a los usuarios.

ActiveSupport::JSON.decode(response.body)["users"].each do |user|
    puts user["name"]
end

Por lo que yo entiendo, el problema es: ruby ​​no reconoce ActiveSupport::JSON.decode(response.body)["users"] como una matriz, y por lo tanto puts me devuelve solo al primer usuario.

¿Cómo resuelvo ese problema?


6
2018-03-27 21:58


origen


Respuestas:


Lo que ha pegado no es JSON válido. La coma posterior después de cada "name" es un problema

"name": "Chris Rivers",

Obtendrás un LoadError tratando de decodificar esto con ActiveSupport::JSON.decode

MultiJson :: LoadError: 399: token inesperado en '{"user_id": 1, "nombre": "Chris Rivers",}, {"user_id": 3, "name": "Peter Curley",}]}'

Si limpiamos el JSON, convirtiéndolo en algo ActiveSupport::JSON.decode puedo entender

"{\"users\": [{\"user_id\": 1,\"name\": \"Chris Rivers\"},{\"user_id\": 3,\"name\": \"Peter Curley\"}]}"

verá que no hay problema para iterar sobre cada objeto en "users" (x a continuación está la cadena JSON anterior)

[8] pry(main)> ActiveSupport::JSON.decode(x)["users"].map { |user| user["name"] }
=> ["Chris Rivers", "Peter Curley"]

9
2018-03-27 22:06



¿Sus datos de origen realmente tienen las comas finales después del nombre de cada usuario? Me sale un error de análisis para eso, pero tu código funciona como lo quieres si los elimino:

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

7
2018-03-27 22:07



El problema no es no reconocer la matriz, son las comas finales después de la "name" elementos.

Eliminarlos permite que el análisis JSON continúe normalmente:

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

6
2018-03-27 22:06