Tengo esta cadena y me pregunto cómo convertirla en Hash.Cómo analizar una representación de cadena de un hash
"{:account_id=>4444, :deposit_id=>3333}"
Tengo esta cadena y me pregunto cómo convertirla en Hash.Cómo analizar una representación de cadena de un hash
"{:account_id=>4444, :deposit_id=>3333}"
Guess nunca ha escrito mi solución para este ... Aquí va,
# strip the hash down
stringy_hash = "account_id=>4444, deposit_id=>3333"
# turn string into hash
Hash[stringy_hash.split(",").collect{|x| x.strip.split("=>")}]
Esto no podrá dividir los campos correctamente si tiene algún dato que contenga un ',' o '=>'. '{: text =>" Bienvenido, amigos. ", delim =>" => "}' – Matt
La forma más fácil y unsafest sería evaluar sólo la cadena:
>> s = "{:account_id=>4444, :deposit_id=>3333}"
>> h = eval(s)
=> {:account_id=>4444, :deposit_id=>3333}
>> h.class
=> Hash
Estoy obteniendo estos en rails post params. ¿No hay una forma segura de convertir cadena en hash que no sea eval? – zoras
No conozco su configuración, pero tal vez sería más fácil obtener un hash en primer lugar. De lo contrario, ruby admite algunos niveles de TAINT, consulte: http://www.ruby-doc.org/docs/ProgrammingRuby/html/taint.html – miku
La forma sugerida en la respuesta de miku es de hecho más fácil y unsafest.
# DO NOT RUN IT
eval '{:surprise => "#{system \"rm -rf/\"}"}'
# SERIOUSLY, DON'T
Considere utilizar una representación de cadena diferente de sus valores hash, p. JSON o YAML. Es mucho más seguro y al menos igualmente robusto.
Con un poco de reemplazo, puede usar YAML:
require 'yaml'
p YAML.load(
"{:account_id=>4444, :deposit_id=>3333}".gsub(/=>/, ': ')
)
Pero esto sólo funciona para esta cadena específica, sencilla. Dependiendo de sus datos reales, puede tener problemas.
si su cadena de hash es una especie de como esta (que se puede anidar o hash de llanura)
stringify_hash = "{'account_id'=>4444, 'deposit_id'=>3333, 'nested_key'=>{'key1' => val1, 'key2' => val2}}"
se puede convertir en picadillo como esto sin usar eval lo cual es peligroso
desired_hash = JSON.parse(stringify_hash.gsub("'",'"').gsub('=>',':'))
y para el uno informados w Aquí la clave es un símbolo puede utilizar como esto
JSON.parse(string_hash.gsub(':','"').gsub('=>','":'))
Los hashes contienen 'nulo' para objetos nulos, mientras que este contiene 'nil', por lo que también tendría que ser reemplazado. –
intente esto: http://stackoverflow.com/questions/1667630/how-do-i-convert-a-string-object- into-a-hash-object – yek