Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby/Rails-JSON.parse/JSON.decode存在问题_Ruby On Rails_Ruby_Json - Fatal编程技术网

Ruby on rails Ruby/Rails-JSON.parse/JSON.decode存在问题

Ruby on rails Ruby/Rails-JSON.parse/JSON.decode存在问题,ruby-on-rails,ruby,json,Ruby On Rails,Ruby,Json,我的控制器在params中接收一个JSON字符串,如下所示: JSON.parse(params[:serialized], symbolize_names: true) {:"key"=>{"subkey1"=>"value", "subkey2"=>"value"} 在控制器中,我尝试以下操作: JSON.parse(params[:serialized], symbolize_names: true) {:"key"=>{"subkey1"=>"val

我的控制器在params中接收一个JSON字符串,如下所示:

JSON.parse(params[:serialized], symbolize_names: true)
{:"key"=>{"subkey1"=>"value", "subkey2"=>"value"}

在控制器中,我尝试以下操作:

JSON.parse(params[:serialized], symbolize_names: true)
{:"key"=>{"subkey1"=>"value", "subkey2"=>"value"}
返回:

{:"key"=>{:subkey1=>"value", :subkey2=>"value"}
所有嵌套的子键都用符号表示;该键用一种奇怪的方式表示,因此它不响应散列[key],而是响应散列[“key”]

如果我遍历Rails堆栈:

ActiveSupport::JSON.decode(params[:serialized]).symbolize_keys
我得到以下回复:

JSON.parse(params[:serialized], symbolize_names: true)
{:"key"=>{"subkey1"=>"value", "subkey2"=>"value"}
除了嵌套键之外,与第一个键几乎相同;它们没有被符号化

我甚至尝试过通过哈希循环,尝试手动符号化键;但没有成功:

Hash[params[:serialized]{ |k, v| [k.to_sym, v] }] # returns {:"key"=>{"subkey1"=>"value", "subkey2"=>"value2"}
为什么会发生这种情况?为什么键被符号化为:“key”,而不是:key

UPD 删除了最后一行(既然我需要我的散列来回答散列[key]而不是散列[“key”]),我怎么可能解决这个问题呢?因此这个问题看起来不那么实际,更具理论性。

首先,: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] }]

当然,如果你有一个以上的“嵌套”级别,你需要更详细的东西。

我同意@boulder上面所说的。但是因为,
Hash[params[:serialized]。symboliced_keys。map{k,v |[k.to_sym,v.symbolic_keys]}
是用来在1级之前进行符号化的。我永远不会真的这么做

这可能与您所要求的不同,但在Rails中访问哈希的键/值通常适合于
hash.key
而不是
hash[:key]
hash['key']

这是主要约定,也是一个人如何访问
@user.name
等字段的原因

Rails通过实现此功能。要使用它,您可以执行以下操作:

@foo = ActiveSupport::JSON.decode(params[:serialized]).symbolize_keys
obj = OpenStruct.new(@foo)
obj.key #=> {"subkey1"=>"value", "subkey2"=>"value"}
但同样,OpenStruct创建对象直到一个级别,以便使用
.key
而不是“:key”进行访问。为了帮助实现这一点,我们有了它,它可以完美地完成这项工作

我个人认为,在这样的场景中,您应该在Rails中工作(如果到达)。

试试Rails控制台

require 'json'
string = {"serialized"=>"{\"key\":{\"subkey1\":"value",\"subkey2\":"value"}"}
hash = JSON.parse string

旧主题,但对于那些可能涉及到它的主题,Rails提供了方法
deep\u symbol\u keys
,该方法在解析json后似乎正好满足op的需要:

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

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

来源:

FWIW
:key==:“key”#=>true
为什么你希望
hash[key]
而不是
hash[:key]
成为可能?@seamusabhere是的,我知道,thanks@sawa我想说这并不重要;更重要的是为什么会发生?手动更改钥匙就是一个例子。我知道:key==:“key”.我问过为什么会发生这种情况;即一半的键转换为:键,另一半转换为:“键”.symbol_keys只调用VARIABLE.to_sym,其计算结果为:VARIABLE。那么魔法在哪里发生了呢?我明白了,我理解你的问题更实用,因为你以“我怎么可能解决这个问题呢?因为我需要我的散列来回答散列[key],而不是散列[“key”]”结束。要回答你的问题,你会得到“key”当您创建无法使用:xxx表示法表示的符号时,使用表示法。例如
“key\”。to_-sym
返回
:“key”
,而
“key”。to_-sym
返回
:key
是的,这是正确的-“key\”返回:“key”,但请注意其中的空格;在第一种情况下,“key: