哈希to_json和back不保留哈希作为键?

时间:2012-11-08 07:49:49

标签: ruby-on-rails ruby json

其他人有这个问题吗?

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对象似乎将该键转换为一个字符串。

1 个答案:

答案 0 :(得分:3)

keys in JSON objects are strings而不是其他:

  

对象是一组无序的名称/值对。对象以{(左大括号)开头,以}(右大括号)结束。每个名称后跟:(冒号),名称/值对由,(逗号)分隔。

     

enter image description here

因此,只要数据结构转换为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}"