3

この問題を抱えている他の人はいますか?

hash_as_key = {'one' => 1, 'two' => 2}
outer_hash = {hash_as_key => 3} 

outer_hash.keys[0].class
=> Hash

as_json = outer_hash.to_json
back_to_obj = JSON.parse(as_json)

back_to_obj.keys[0]
=> "{\"one\"=>1, \"two\"=>2}"
back_to_obj.keys[0].class
=> String

キーがハッシュ自体である Hash オブジェクトがある場合、JSON に変換して Ruby オブジェクトに戻すと、キーが String に変換されるようです。

4

1 に答える 1

3

JSON オブジェクトのキーは文字列であり、他には何もありません:

オブジェクトは、名前と値のペアの順序付けられていないセットです。オブジェクトは{(左中括弧) で始まり}(右中括弧) で終わります。各名前の後には (コロン) が続き、名前と値のペアは(カンマ):で区切られます。,

ここに画像の説明を入力

したがって、データ構造が JSON に変換されるとすぐに、キーは文字列になります。次に、データが JSON になると、キーの元の型情報は失われます。

Ruby のハッシュは、JSON のオブジェクトよりもかなり柔軟で一般的であるため、すべての Ruby ハッシュを JSON で表現できるわけではありません。データの保存と転送に JSON をターゲットにしている場合は、データを JSON がサポートするものに制限するか、データを JSON 互換の構造に変換する必要があります。

中間の JSON を見ると、何が起こっているかがわかります。

> puts outer_hash.to_json
{"{\"one\"=>1, \"two\"=>2}":3}

したがって、キーは文字列です。それがあなたに与える'{"one"=>1, "two"=>2}'ものだからです。hash_as_key.to_s同様に、数値キーは文字列化されto_s、その「数値性」が失われます。

> {1 => 2}.to_json
=> "{\"1\":2}" 
于 2012-11-08T08:00:40.593 に答える