Извлечение отдельных данных из URL JSON для Dashboard - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь отобразить значение "sgv" в виджете панели Dashing / Smashing.В конечном счете, я также хотел бы показать значение «направления».Я сталкиваюсь с проблемами с потерей этого точного значения, которое меняется каждые 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

Я также искал архивы несколько раз.Я не хочу записывать это в файл, подобный , этот показывает, и дубликат вопроса был удален или перемещен.

Я понимаю, что JSON.parse (ответ) просто собирается проанализировать все, что я говорю, равный ответ, но я не знаю, как получить этот ответ равным SGV.Возможно, решение не в RestClient, но именно здесь я потерялся.

Вот URL 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, "направление": "плоский", "устройство": "share2", "тип": "Sgv"}] * +1015 *

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вам нужно что-то вроде response[0]["sgv"], которое должно возвращать 52, если у вас будет много элементов в списке, вам нужно будет перебрать их.

Лучшее, что вы можете сделать, это сломать свойпроблема в более простых частях для отладки.Поскольку у вас возникают проблемы с доступом к некоторым JSON через API, вы должны сделать простой скрипт, который выполняет только ту функцию, которую вы хотите, чтобы протестировать ее и увидеть, в чем проблема.

Вот небольшой пример, который выможно поместить в файл .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 выражении.Получив доступ к идентификатору массива, вы можете просто использовать нужный вам объект как [sgv]

Если ваше приложение когда-либо возвращает более одной записи, вам нужно будет изменить код, чтобы прочитать все результаты ипереберите их, чтобы получить все нужные значения.

0 голосов
/ 21 сентября 2018

Вот окончательный код, который заставил его работать

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', поскольку он больше не используется, но он работает прямо сейчас, и это все, что имеет значение.

...