使用Sinatra从URL中解析JSON数据

时间:2015-11-26 02:28:13

标签: ruby json sinatra

我正在使用Sinatrarb完成任务

我需要:

从网址

解析JSON对象的数据

单独输出json数据的一个属性并将其存储为变量

对变量

运行一些算术运算

将结果作为新变量返回

然后将其作为新的json对象发布到新的URL。

我已经看到了各种各样的信息,包括关于parsing JSON data in ruby的信息和关于open-uri的信息,但我相信,如果给出了大多数类似的解决方案,那么有人会逐步打破这一点这要么是过时的,要么是过于复杂的。

提前致谢。

1 个答案:

答案 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")

希望这会有所帮助。如果你遇到困难,请告诉我,我会尽力伸出援助之手。我不是红宝石专家,但想帮助一位探险家。祝你好运。