Ho questa stringa e mi chiedo come convertirla in un hash.Come analizzare una rappresentazione di stringa di un hash
"{:account_id=>4444, :deposit_id=>3333}"
Ho questa stringa e mi chiedo come convertirla in un hash.Come analizzare una rappresentazione di stringa di un hash
"{:account_id=>4444, :deposit_id=>3333}"
congettura non ho mai postato la mia soluzione per questo ... Qui si 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("=>")}]
Questo non riuscirà a dividere correttamente i campi se hai dei dati che contengono un ',' o '=>'. '{: text =>" Benvenuto, amici. ", delim =>" => "}' – Matt
Il metodo più semplice e unsafest sarebbe quello di valutare solo la stringa:
>> s = "{:account_id=>4444, :deposit_id=>3333}"
>> h = eval(s)
=> {:account_id=>4444, :deposit_id=>3333}
>> h.class
=> Hash
Sto ottenendo questi in rail post params. Non c'è un modo sicuro per convertire le stringhe in hash diversi da eval. – zoras
Non conosco il tuo setup, ma forse sarebbe più facile recuperare un hash in primo luogo. Altrimenti, ruby supporta alcuni livelli di TAINT, vedi: http://www.ruby-doc.org/docs/ProgrammingRuby/html/taint.html – miku
Il modo suggerito nella risposta di Miku è infatti più semplice e unsafest.
# DO NOT RUN IT
eval '{:surprise => "#{system \"rm -rf/\"}"}'
# SERIOUSLY, DON'T
Considerare l'utilizzo di una rappresentazione di stringa diversa degli hash, ad es. JSON o YAML. È molto più sicuro e almeno altrettanto robusto.
Con un po 'di sostituzione, è possibile utilizzare YAML:
require 'yaml'
p YAML.load(
"{:account_id=>4444, :deposit_id=>3333}".gsub(/=>/, ': ')
)
Ma questo funziona solo per questa specifica, semplice stringa. A seconda dei tuoi dati reali potresti avere problemi.
se il vostro hash stringa è una sorta di come questo (che può essere nidificato o hash pianura)
stringify_hash = "{'account_id'=>4444, 'deposit_id'=>3333, 'nested_key'=>{'key1' => val1, 'key2' => val2}}"
è possibile convertire in hash come questo senza usare eval che è pericoloso
desired_hash = JSON.parse(stringify_hash.gsub("'",'"').gsub('=>',':'))
e per quello che hai postato w qui la chiave è un simbolo si può usare come questo
JSON.parse(string_hash.gsub(':','"').gsub('=>','":'))
Gli hash contengono 'null' per oggetti nulli, dove questo contiene 'nil', quindi anche questo dovrebbe essere sostituito. –
provare questo: http://stackoverflow.com/questions/1667630/how-do-i-convert-a-string-object- into-a-hash-object – yek