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 回答
1

我同意@boulder 上面所说的。但是,因为,Hash[params[:serialized].symbolized_keys.map{ |k, v| [k.to_sym, v.symbolize_keys] }]是为了象征直到 1 级。我永远不会真的去做这个,永远。

这可能与您所要求的不同,但在 Rails 中访问哈希的键/值通常适合hash.key代替hash[:key]or hash['key']
这是主要约定,也是人们如何访问诸如此类的字段的原因@user.name

Rails 通过OpenStruct. 要使用它,您可以执行以下操作:

@foo = ActiveSupport::JSON.decode(params[:serialized]).symbolize_keys
obj = OpenStruct.new(@foo)
obj.key #=> {"subkey1"=>"value", "subkey2"=>"value"}

但同样,OpenStruct 将对象创建到一个级别,以便使用.key而不是 ':key' 进行访问。为了帮助实现这一点,我们有Recursive OpenStruct,它完美地完成了这项工作。

这就是我个人感觉的方式,你应该在这样的场景中在 Rails 中工作(如果到达)。

于 2013-04-29T16:05:30.727 回答
0

首先, :key 和 :"key" 是表达完全相同事物的两种方式。事实上,如果你这样做:

> :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 回答
0

老话题,但对于那些可能落在它上面的人,Rails 提供了deep_symbolize_keys在解析 json 之后似乎完全符合 op 需要的方法:

hash = { 'person' => { 'name' => 'Rob', 'age' => '28' } }

hash.deep_symbolize_keys
# => {:person=>{:name=>"Rob", :age=>"28"}}

来源:https ://apidock.com/rails/Hash/deep_symbolize_keys

于 2019-10-02T11:57:41.347 回答