其他人有这个问题吗?
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对象似乎将该键转换为一个字符串。
答案 0 :(得分:3)
keys in JSON objects are strings而不是其他:
对象是一组无序的名称/值对。对象以
{
(左大括号)开头,以}
(右大括号)结束。每个名称后跟:
(冒号),名称/值对由,
(逗号)分隔。
因此,只要数据结构转换为JSON,您的密钥就会成为字符串。然后,一旦您的数据使用JSON,您的密钥的原始类型信息将丢失。
Ruby的Hashes比JSON的对象更灵活,更通用,因此不是每个Ruby Hash都可以用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}"