Ruby:如何解析jsonp并将json数据保存到数据库

时间:2014-09-03 09:47:03

标签: ruby-on-rails ruby json database jsonp

我想解析JSONP数据并将数据保存到我的数据库中。

我有我的jsonp网址,可以说这是>> http://a0.awsstatic.com/pricing/1/ec2/pricing-data-transfer-with-regions.min.js?callback=callback&_=1409722308446

它不是普通的json对象,所以我如何在rails上的ruby / ruby​​中解析这个json并将数据保存到我的数据库中。我想保存表格中的数据,包括区域,名称,类型,价格。

有什么方法可以做到这一点。

3 个答案:

答案 0 :(得分:3)

JSONP是针对客户端JavaScript中相同原始策略的解决方案。在Ruby中处理数据不是必需的。首先,我会尝试在没有回调的情况下找到普通JSON中可用的数据。

但是,如果该URL绝对是您可以调用此数据的唯一URL,那么我将使用正则表达式去除回调,然后解析普通的JSON数据。

如果您已将该文件的内容加载到名为jsonp的变量中,则此类内容可能有效:

require 'net/http'
require 'json'
uri = URI.parse('http://a0.awsstatic.com/pricing/1/ec2/rhel-od.min.js?callback=callback&_=1409731896563')
jsonp = Net::HTTP.get(uri)
jsonp.gsub!(/^.*callback\(/, '') # removes the comment and callback function from the start of the string
jsonp.gsub!(/\);$/, '') # removes the end of the callback function
jsonp.gsub!(/(\w+):/, '"\1":')
hash = JSON.parse(jsonp)

然后hash将从响应中获得解析后的JSON。

请注意,此代码没有错误处理,应将其视为最终解决方案的起点。

[edit]添加了第三个gsub,将JavaScript样式键更改为JSON样式键。这适用于这种情况,因为所有键看起来都很简单,足以适应该正则表达式。 [edit2]添加了使用Net :: HTTP

加载JSONP的方法

答案 1 :(得分:1)

如果您真正想要做的是将亚马逊价格表JS文件解析为Ruby,那么有一种更好的方法(阅读:更安全 - 无法逃避):

require 'net/http'
require 'json'

JSON.parse(
  Net::HTTP.get(
    URI.parse('http://a0.awsstatic.com/pricing/1/ec2/rhel-od.min.js')
  ).split('callback(')[1].sub(');', '').gsub(/(\w+):/, '"\1":')
)

答案 2 :(得分:0)

由于数据是原始的JS对象形式,它实际上是有效的Ruby:

require 'json'
data = '{key: "value", key2: 33}'
obj = eval data
obj[:key]
#=> "value"
obj.to_json
# => "{\"key\":\"value\",\"key2\":33}" 

你必须完全信任你的源代码 - 如果数据被篡改,这将允许运行抽象的Ruby代码 - 这可以反过来运行抽象的命令行终端代码,使用反向运算符。例如,这可能会删除您的硬盘。