【问题标题】:Extract Single Data From JSON URL for Dashing Dashboard从 JSON URL 中提取单个数据以用于仪表板
【发布时间】:2019-02-22 18:48:38
【问题描述】:

我正在尝试在 Dashing / Smashing 仪表板小部件上显示“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 网址:http://dnarnianbg.herokuapp.com/api/v1/entries/current.json

编辑:该链接的输出是这样的:

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

【问题讨论】:

  • 是的。这是血糖读数。我想在仪表板上显示 SGV 的值
  • 类似:current_nightscout = response[0]["sgv"]
  • @user3788685 你介意我们看看那里发生的事情,以便我可以从中学习吗? JSON.parse(open("url" - 这是解析 JSON 并打开实际 URL 吗? :read_timeout => 4 - 我认为这是读取超时,但 => 4 等于什么? b> p test [0]["sgv"] - 我认为这是对变量 test 执行 puts 操作,但我不确定 [0] 部分在做什么? 感谢您的所有帮助

标签: json ruby rest-client dashing


【解决方案1】:

您需要类似 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返回值

我意识到这个简短的甜蜜示例可能对学习者没什么用,所以这里有一个更详细的版本,带有一些 cmets;

#!/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"]

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

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

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

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

【讨论】:

  • 我可以通过删除 current.json 并只执行 entry.json 来一次执行多个操作。谢谢你帮我解决这个问题!
【解决方案2】:

这是使它工作的最终代码

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

【讨论】:

    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多