在Sinatra应用程序中解析请求JSON

时间:2015-02-21 01:17:53

标签: ruby json sinatra

我在将请求中的JSON解析到我的Sinatra应用程序时遇到了一些困难:

response = JSON.pretty_generate(request.env)
reply = response["rack.request.form_hash"]

导致回复:

rack.request.form_hash

作为字符串而不仅仅是响应的相关部分:

   {...
     "rack.request.form_hash": {
   "token": "token",
   "team_id": "team",
   "team_domain": "teamname",
   "service_id": "service",
   "channel_id": "channel",
   "channel_name": "testing-webhooks",
   "timestamp": "1424480976.000910",
   "user_id": "U029W1WF2",
   "user_name": "myusername",
   "text": "checkeverything",
   "trigger_word": "checkeverything"
 },
 ...}

这是我正在尝试解析的JSON请求对象中。当我使用时:

response["rack.request.form_hash"]["user_name"]

没有任何回复。我的日志中返回以下内容:

 App 1662 stdout: 
App 1640 stderr: JSON::ParserError - 746: unexpected token at 'No text specified':

所以看起来它没有正确迭代,或者可能无法访问它。

我查看了其他文档和其他帖子,但发现没有什么对我有用,但我肯定会忽略一些东西,但我不确定是什么。

在对Sinatra的请求中解析此嵌套数组的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

这应该解决它:

res = JSON.parse( JSON.generate(request.env) )
res.class
# => Hash
res["rack.url_scheme"]
# => http

原因是JSON.generate仅为字符串中的对象和数组生成JSON语法。然后,您需要使用JSON.parse将生成的JSON字符串解析为Ruby中的哈希。