Поиск ответа 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 не принесли ничего, что сработает.
Любые предложения?
Ответы
Ответ 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