我正在使用Sinatrarb完成任务
我需要:
从网址
解析JSON对象的数据单独输出json数据的一个属性并将其存储为变量
对变量
运行一些算术运算将结果作为新变量返回
然后将其作为新的json对象发布到新的URL。
我已经看到了各种各样的信息,包括关于parsing JSON data in ruby的信息和关于open-uri的信息,但我相信,如果给出了大多数类似的解决方案,那么有人会逐步打破这一点这要么是过时的,要么是过于复杂的。
提前致谢。
答案 0 :(得分:1)
这是一个简单的指南。我最近做了同样的任务。
让我们使用这个JSON(把它放在一个名为'simple.json'的文件中):
{
"name": "obscurite",
"favorites": {
"icecream": [
"chocolate",
"pistachio"
],
"cars": [
"ferrari",
"porsche",
"lamborghini"
]
},
"location": "NYC",
"age": 100}
从网址解析JSON对象的数据。
第1步是添加对JSON解析的支持:
require 'json'
第2步是从我们新的.json文件中加载JSON数据:
json_file = File.read('simple.json')
json_data = JSON.parse(json_file)
单独输出json数据的一个属性并将其存储为变量
我们的数据是外部哈希的形式(带有键的大括号:值)。一些值也是哈希值('favorites'和'cars')。这些内部哈希值是列表(Ruby中的数组)。所以我们所拥有的是散列哈希,其中一些散列是数组。
让我们拉出我的位置:
puts json_data['location'] # NYC
这很容易。它只是一个顶级键/值。让我们深入一点,拉出我最喜欢的冰淇淋:
puts json_data['favorites']['icecream'] # chocolate pistachio
现在只有我最喜欢的第二辆车:
puts json_data['favorites']['cars'][1] # porsche
对变量
运行一些算术运算
步骤3.让我的年龄降低50年。成为100是艰难的!
new_age = json_data['age'] / 2
puts new_age
将结果作为新变量返回
步骤4.让我们把新时代带回json
json_data['age'] = new_age
puts json_data['age'] # 50
然后将其作为新的json对象发布到新的URL。
步骤5.添加程序执行HTTP POST的功能。在顶部添加:
require 'net/http'
然后你可以发布你想要的任何地方。我发现你可以使用假的网络服务,如果你只是想确保请求到达那里。
# use this guy's fake web service page as a test. handy!
uri = URI.parse("http://jsonplaceholder.typicode.com/posts")
header = {'Content-Type'=> 'text/json'}
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri, header)
request.body = json_data.to_json
response = http.request(request)
# Did we get something back?
puts response.body
在linux或mac上,你可以打开一个localhost端口并作为测试收听:
nc -4 -k -l -v localhost 1234
要POST到此端口,请将uri更改为:
uri = URI.parse("http://localhost:1234")
希望这会有所帮助。如果你遇到困难,请告诉我,我会尽力伸出援助之手。我不是红宝石专家,但想帮助一位探险家。祝你好运。