私のコントローラーは、次のような params 内の JSON 文字列を受け取ります。
{"serialized"=>"{\"key\":{\"subkey1\":"value",\"subkey2\":"value"}"}
私のコントローラーでは、次のことを試します。
JSON.parse(params[:serialized], symbolize_names: true)
どちらが返されますか:
{:"key"=>{:subkey1=>"value", :subkey2=>"value"}
ネストされたサブキーはすべて記号化されました。キーは奇妙な方法で記号化されているため、hash[key]には応答しませんが、hash["key"]には応答します。
Rails スタックを調べると、次のようになります。
ActiveSupport::JSON.decode(params[:serialized]).symbolize_keys
私は以下を返します:
{:"key"=>{"subkey1"=>"value", "subkey2"=>"value"}
ネストされたキーを除いて、最初のものとほぼ同じです。それらはシンボル化されていません。
キーを手動で記号化しようとして、ハッシュをループしてみました。ただし、成功しませんでした:
Hash[params[:serialized]{ |k, v| [k.to_sym, v] }] # returns {:"key"=>{"subkey1"=>"value", "subkey2"=>"value2"}
なぜこうなった?キーが:keyではなく:"key"として記号化されるのはなぜですか?
UPDは最後の行を削除しました( hash["key"] ではなくhash [key] に答えるためにハッシュが必要なので、どうすればそれを修正できますか。)そのため、質問は実用的ではなく、より理論的に見えます。