1

私のコントローラーは、次のような 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] に答えるためにハッシュが必要なので、どうすればそれを修正できますか。)そのため、質問は実用的ではなく、より理論的に見えます。

4

4 に答える 4

2

Railsコンソールで試してみてください。

require 'json'
string = {"serialized"=>"{\"key\":{\"subkey1\":"value",\"subkey2\":"value"}"}
hash = JSON.parse string
于 2013-04-29T16:11:02.630 に答える
0

まず、:key と :"key" は、まったく同じことを表す 2 つの方法です。実際、次の場合:

> :key == :"key" 
=> true

したがって、次のようなハッシュが与えられます

h = {:"key" => "value"}
h[:key]
=> "value"

次に、ネストされたハッシュがある場合、キーを手動で記号化するだけでなく、値のキーも記号化する必要があります。

Hash[params[:serialized].symbolized_keys.map{ |k, v| [k.to_sym, v.symbolize_keys] }]

もちろん、複数のレベルの「入れ子状態」がある場合は、より精巧なものが必要です。

于 2013-04-29T15:48:47.187 に答える