我想解析JSONP数据并将数据保存到我的数据库中。
我有我的jsonp网址,可以说这是>> http://a0.awsstatic.com/pricing/1/ec2/pricing-data-transfer-with-regions.min.js?callback=callback&_=1409722308446
它不是普通的json对象,所以我如何在rails上的ruby / ruby中解析这个json并将数据保存到我的数据库中。我想保存表格中的数据,包括区域,名称,类型,价格。
有什么方法可以做到这一点。
答案 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代码 - 这可以反过来运行抽象的命令行终端代码,使用反向运算符。例如,这可能会删除您的硬盘。