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

Extract Single Data From JSON URL for Dashing Dashboard

我正在尝试在 Dashing / Smashing 仪表板小部件上显示 "sgv" 值。最后,我还想显示 "direction" 值。我 运行 遇到了将每 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

编辑:link 的输出是这样的:

[{"_id":"5ba295ddb8a1ee0aede71822","sgv":87,"date":1537381813000,"dateString":"2018-09-19T18:30:13.000Z", "trend":4,"direction":"Flat","device":"share2","type":"sgv"}]

这是使它工作的最终代码

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',因为它不再被使用,但它现在可以工作,这才是最重要的。

你需要像 response[0]["sgv"] 这样的东西,它应该 return 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"]

那应该 return 来自 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。您的服务器 return 只有 1 个结果,编号为“0”,因此您需要 [0] 在您的 p 语句中。一旦你访问了数组 id,你就可以简单地使用你需要的对象作为 [sgv]

如果您的应用 return 有不止一条记录,那么您将需要更改代码以读取所有结果并迭代它们以获得所需的所有值。