Подтвердить что ты не робот

Поиск ответа JSON с использованием Ruby

Я использую Ruby script для взаимодействия с API-интерфейсом приложения, и возвращаемые результаты находятся в формате JSON. Например:

{
  "incidents": [
    {
      "number": 1,
      "status": "open",
      "key": "abc123"
    }
    {
      "number": 2,
      "status": "open",
      "key": "xyz098"
    }
    {
      "number": 3,
      "status": "closed",
      "key": "lmn456"
    }
  ]
}

Я ищу для поиска каждого блока для определенного значения "ключа" (yzx098 в этом примере) и возвращает связанное значение "число".

Теперь я очень новичок в Ruby, и я не уверен, есть ли функция, которая поможет выполнить это. Тем не менее, пару дней чистки книг по ресурсам Googles и Ruby не принесли ничего, что сработает.

Любые предложения?

4b9b3361

Ответ 1

Прежде всего, JSON должен быть следующим: (обратите внимание на запятые)

 {
  "incidents": [
    {
      "number": 1,
      "status": "open",
      "key": "abc123"
    },
    {
      "number": 2,
      "status": "open",
      "key": "xyz098"
    },
    {
      "number": 3,
      "status": "closed",
      "key": "lmn456"
    }
  ]
}

Выделите вышеупомянутый json в переменной

s =  '{"incidents": [{"number": 1,"status": "open","key": "abc123"},{"number": 2,"status": "open","key": "xyz098"},{"number": 3,"status": "closed","key": "lmn456"}]}'

Разберите JSON

h = JSON.parse(s)

Найдите требуемый number с помощью map

h["incidents"].map {|h1| h1['number'] if h1['key']=='xyz098'}.compact.first

Или вы также можете использовать find, как показано ниже

 h["incidents"].find {|h1| h1['key']=='xyz098'}['number']

Или вы также можете использовать select, как показано ниже

h["incidents"].select {|h1| h1['key']=='xyz098'}.first['number']

Ответ 2

Сделайте, как показано ниже

# to get numbers from `'key'`.
json_hash["incidents"].map { |h| h['key'][/\d+/].to_i }
  • json_hash["incidents"] - даст вам значение ключа "incidents", который представляет собой не что иное, как массив хэшей.

  • map, чтобы перебрать все хэш и собрать значение 'key'. Затем применяя Hash#[] к каждому внутреннему хешу массива, чтобы получить значение "key". Затем вызывается str[regexp], чтобы получить только числовые строки, такие как '098' от "xyz098", наконец, применяя to_i, чтобы получить от него фактическое целое число.

Если данный хэш фактически является строкой json, сначала проанализируйте ее, используя JSON::parse, чтобы преобразовать ее в хэш. Затем выполните повторяйте, как я сказал выше.

require 'json'

json_hash = JSON.parse(json_string)
# to get values from the key `"number"`.
json_hash["incidents"].map { |h| h['number'] } # => [1, 2, 3]
# to search and get all the numbers for a particular key match and take the first
json_hash["incidents"].select { |h| h['key'] == 'abc123' }.first['number'] # => 1
# or to search and get only the first number for a particular key match
json_hash["incidents"].find { |h| h['key'] == 'abc123' }['number'] # => 1