Saltar al contenido

Ruby JSON parse cambia las claves Hash

Solución:

El generador JSON convierte símbolos en cadenas porque JSON no admite símbolos. Dado que las claves JSON son todas cadenas, el análisis de un documento JSON producirá un hash Ruby con claves de cadena de forma predeterminada.

Puede decirle al analizador que use símbolos en lugar de cadenas mediante la symbolize_names opción.

Ejemplo:

original_hash = {:info => [{:from => "Ryan Bates", :message => "sup bra", :time => "04:35 AM"}]}
serialized = JSON.generate(original_hash)
new_hash = JSON.parse(serialized, {:symbolize_names => true})

new_hash[:info]
 #=> [{:from=>"Ryan Bates", :message=>"sup bra", :time=>"04:35 AM"}]

Referencia: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/JSON.html#method-i-parse

En resumen, no. Piénselo de esta manera, almacenar símbolos en JSON es lo mismo que almacenar cadenas en JSON. Por lo tanto, no es posible distinguir entre los dos cuando se trata de analizar la cadena JSON. Por supuesto, puede convertir las claves de cadena de nuevo en símbolos o, de hecho, incluso crear una clase para interactuar con JSON que lo haga automáticamente, pero recomendaría solo usar cadenas.

Pero, por el simple hecho de hacerlo, aquí están las respuestas a esta pregunta las veces que se hizo anteriormente:

¿Cuál es la mejor manera de convertir un par clave-valor con formato json a ruby ​​hash con el símbolo como clave?

ActiveSupport :: JSON decodifica símbolos de pérdida de hash

O quizás un HashWithIndifferentAccess

Resolví mi problema similar al llamar al método with_indifferent_access en él

Aquí tengo una cadena json y podemos asignarla a la variable s

s = "{"foo":{"bar":"cool"}}"

Entonces ahora puedo analizar los datos con la clase JSON y asignarlos ah

h = JSON.parse(s).with_indifferent_access

Esto producirá un hash que puede aceptar una cadena o un símbolo como clave.

h[:foo]["bar"]
  #=> "cool"
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *