2011-03-04 19 views
5

Estoy intentando serializar y deserializar un hash. Cuando el hash es deserailizado, las claves son des-simbolizadas; p.ej. no más: uno, más bien "uno".ActiveSupport :: JSON decodificar hash símbolos perdedores

Desde la consola rieles:

>>h = { :one =>1, :two => "two"} 
{:one=>1, :two=>"two"} 
>>j = ActiveSupport::JSON.encode(h) 
"{\"one\":1,\"two\":\"two\"}" 
>>h2 = ActiveSupport::JSON.decode(j) 
{"one"=>1, "two"=>"two"} 
>>h2[:one] 
nil 
>>h[:one] 
1 

he cambiado a usar Marshal.dump/carga por ahora. Sin embargo, quería lanzar esto para ver si había una manera de mantener esto en JSON (solo por legibilidad).

Respuesta

8
h2 = ActiveSupport::JSON.decode(j).symbolize_keys 
+5

Nota: esto no simboliza las teclas recursivamente. – TelegramSam

+0

Tampoco funciona para una matriz que contiene objetos JSON, es decir '[{'id': 1}, {'id': '2'}, ...]'. La solución de Tim Cull funciona sin embargo. – laffuste

16

JSON.parse(j, {:symbolize_names => true}) debe ser un poco mejor, ya que (supongo) nunca crea claves de cadena en el primer lugar y por lo tanto conserva la memoria para grandes valores hash con las mismas claves repite a menudo

+0

Supongo que lo que la gente realmente quiere es un https://apidock.com/rails/ActiveSupport/HashWithIndifferentAccess por lo que funciona como Rails lo hace de forma predeterminada, es decir: permitir tanto 'h ['one']' y 'h [: one ] ' – Magne

+0

Entonces:' JSON.parse (j, {: symbolize_names => true}). With_indifferent_access'. Tenga en cuenta que esto solo funciona en Rails, por lo que, por ejemplo, las antiguas clases simples de Ruby ejecutadas por procesos en segundo plano podrían no tener acceso al método Hash '.with_indifferent_access' que define ActiveSupport. – Magne

+0

PD: también simboliza claves recursivamente. – Magne

Cuestiones relacionadas