将发送的参数转换为json

时间:2015-04-21 15:50:47

标签: ruby-on-rails json

我有控制器方法为POST发送json params执行一些操作,但问题是当我尝试发送没有json头的json params时。
我想通过将字符串转换为json来处理此异常,此处问题就开始了。

假设我有这样简单的JSON:

{"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}} 

我已将binding.pry置于方法的开头,我试图从那里获得参数。我发现request.body将返回我必须转换为JSON的对象#<StringIO:0x007fbdb5cf9fe8>
我尝试的第一件事是:

[1] pry(#<TestController>)> request.body.to_json
=> "[\"{\\\"menu\\\": {\\n\",\"  \\\"id\\\": \\\"file\\\",\\n\",\"  \\\"value\\\": \\\"File\\\",\\n\",\"  \\\"popup\\\": {\\n\",\"    \\\"menuitem\\\": [\\n\",\"      {\\\"value\\\": \\\"New\\\", \\\"onclick\\\": \\\"CreateNewDoc()\\\"},\\n\",\"      {\\\"value\\\": \\\"Open\\\", \\\"onclick\\\": \\\"OpenDoc()\\\"},\\n\",\"      {\\\"value\\\": \\\"Close\\\", \\\"onclick\\\": \\\"CloseDoc()\\\"}\\n\",\"    ]\\n\",\"  }\\n\",\"}}\"]"

但这不是我想要的结果。
我尝试过几个转换器,比如:

[2] pry(#<TestsController>)> ActiveSupport::JSON.decode(request.body.to_json)                                                                                                                                                                                                
=> []

这也没有给我什么。我没有想法。 我想得到这样的东西:

[1] pry(#<TestsController>)> params
=> {"menu"=>{"id"=>"file", "value"=>"File", "popup"=>{"menuitem"=>[{"value"=>"New", "onclick"=>"CreateNewDoc()"}, {"value"=>"Open", "onclick"=>"OpenDoc()"}, {"value"=>"Close", "onclick"=>"CloseDoc()"}]}},
 "controller"=>"payments",
 "action"=>"notification",
 "payment"=>{"menu"=>{"id"=>"file", "value"=>"File", "popup"=>{"menuitem"=>[{"value"=>"New", "onclick"=>"CreateNewDoc()"}, {"value"=>"Open", "onclick"=>"OpenDoc()"}, {"value"=>"Close", "onclick"=>"CloseDoc()"}]}}}}

这是使用json标头发送params的方案。在那,我可以轻松地遍历它们。

4 个答案:

答案 0 :(得分:6)

您应该在JSON.parse

上使用request.body.read
request.body.rewind
JSON.parse(request.body.read)

答案 1 :(得分:2)

你试过吗? request.body替换为env [&#39; rack.input&#39;]。读取

json = JSON.parse env['rack.input'].read 

OR

json = JSON.parse request.body.read

如所述here

答案 2 :(得分:1)

由于您使用的是RoR,如果您使用的是Action Controller Parameters,则可以使用to_hash方法,然后使用to_json(仅在RoR上,而不是Ruby的一部分)进行转换你允许的参数,如下:

params.permit(:attributes).to_hash.to_json

答案 3 :(得分:1)

在我看来,这可行:

JSON.parse(params[:attributes].to_json)