从JSON URL提取单个数据以用于仪表板

时间:2018-09-18 17:09:34

标签: json ruby rest-client dashing

我正在尝试在“仪表板/粉碎”仪表板小部件上显示“ sgv”值。最终,我也想展示“方向”值。我遇到了将精确值降低到每3到5分钟更改一次的问题。我已经可以使用以下命令来镜像确切的字符串:

require 'net/http'
require 'rest-client'
require 'json'

url = "https://dnarnianbg.herokuapp.com/api/v1/entries/current.json"
response = RestClient.get(url)
JSON.parse(response)

# :first_in sets how long it takes before the job is first run. In this case, it is run immediately
current_nightscout = 0

SCHEDULER.every '5m' do 
  last_nightscout = current_nightscout
  current_nightscout = response

  send_event('nightscout', { current: current_nightscout, last: last_nightscout })
 end

我也搜索过几次档案。我不希望将其写入类似this one节目的文件中,并且重复的问题已被删除或移动。

我意识到JSON.parse(response)只会解析我告诉它的响应相等的内容,但是我不知道如何使该响应等于SGV。也许解决方案不在RestClient中,但这就是我迷路的地方。

这是JSON URL:http://dnarnianbg.herokuapp.com/api/v1/entries/current.json

编辑:该链接的输出如下所示:

[{“ _ id”:“ 5ba295ddb8a1ee0aede71822”,“ sgv”:87,“ date”:1537381813000,“ dateString”:“ 2018-09-19T18:30:13.000Z”,“趋势”:4,“方向“:”平面“,”设备“:” share2“,”类型“:” sgv“}]

2 个答案:

答案 0 :(得分:0)

这是使之工作的最终代码

require 'net/http'
require 'json'
require 'rest-client'

# :first_in sets how long it takes before the job is first run. In this case, it is run immediately
current_nightscout = 0

SCHEDULER.every '1m' do 

test = JSON.parse(open("https://dnarnianbg.herokuapp.com/api/v1/entries/current.json", :read_timeout => 4).read)


  last_nightscout = current_nightscout
  current_nightscout = p test[0]["sgv"]

  send_event('nightscout', { current: current_nightscout, last: last_nightscout })
 end

我可能可以消除require 'rest-client',因为它已不再使用,但现在就可以使用,这很重要。

答案 1 :(得分:0)

您需要类似response[0]["sgv"]之类的东西,如果最终在列表中有很多项,则应返回52,您需要对其进行迭代。

您能做的最好的事情是将问题分解为易于调试的部分。当您通过API访问某些JSON时遇到问题时,您应该制作一个简单的脚本,该脚本仅执行您想要的功能,以便对其进行测试并查看问题出在哪里。

这是一个简短的示例,您可以将其放入.rb文件中并运行;

#!/usr/bin/ruby

require 'open-uri'
require 'json'

test = JSON.parse(open("https://dnarnianbg.herokuapp.com/api/v1/entries/current.json", :read_timeout => 4).read)

puts test[0]["sgv"]

那应该返回sgv

中的值

我意识到简短的甜蜜示例可能对学习者没有多大用处,因此这是一个带有一些注释的更详细的版本;

#!/usr/bin/ruby

require 'open-uri'
require 'json'

# Open the URL and read the result. Time out if this takes longer then 4 sec.
get_data = open("https://dnarnianbg.herokuapp.com/api/v1/entries/current.json", :read_timeout => 4).read

# Parse the response (get_data) to JSON and put in variable output
output = JSON.parse(get_data)

# Put the output to get the 'sgv figure'
p output[0]["sgv"]

手动检查您返回的数据总是值得的,在这种情况下,数据看起来像这样(漂亮时)

[
  {
    "_id": "5ba41a0fb8a1ee0aedf6eb2c",
    "sgv": 144,
    "date": 1537481109000,
    "dateString": "2018-09-20T22:05:09.000Z",
    "trend": 4,
    "direction": "Flat",
    "device": "share2",
    "type": "sgv"
  }
]

实际上拥有的是Array。您的服务器仅返回1个结果,编号为“ 0”,因此您在[0]语句中需要p。访问数组ID后,您可以简单地将所需的对象用作[sgv]

如果您的应用返回的记录多于一条,那么您将需要更改代码以读取所有结果并对其进行迭代,以获取所需的所有值。

相关问题