Не удается извлечь данные из проанализированного хэша JSON в ruby - PullRequest
2 голосов
/ 23 сентября 2019

Я пытаюсь извлечь элементы из этого ответа API, но по какой-то причине не могу.У меня есть следующее тело ответа API: `

[
  {
    "ID": "295699",
    "restriction": [
      {
        "restrictionTypeCode": "10001"
      }
    ]
  }
]

` Теперь я просто хочу напечатать limittionTypeCode

  json_string = RestClient.get "#{$uri}", {:content_type => 'application/json'}
  hash = JSON.parse(json_string) 
  code= hash['restriction']['restrictionTypeCode']
  puts code

вышеприведенные ошибки кода, и он не отображает limittionTypeCode

1 Ответ

3 голосов
/ 23 сентября 2019

Ваша проблема в том, что ваши данные возвращают массивы местами.Попробуйте следующее:

data = [
  {
    "ID": "295699",
    "restriction": [
      {
        "restrictionTypeCode": "10001"
      }
    ]
  }
]

data.first[:restriction].first[:restrictionTypeCode]
# to make this safe from any nil values you may encounter, you might want to use
data.first&.dig(:restriction)&.first&.dig(:restrictionTypeCode)
# => "10001"

# or 

data.flat_map { |hsh| hsh[:restriction]&.map { |sub_hsh| sub_hsh[:restrictionTypeCode] } }
# => ["10001"]

Чтобы немного разбить его, ваш отклик верхнего уровня и тот, который попадает под клавишу :restriction, оба возвращают массивы;поэтому, чтобы получить от них данные, вам нужно либо получить доступ к одному из содержащихся в них элементов (в моем примере это first), либо отобразить их (второй пример).

Я добавил несколько проверок дляnil значений там: это очень важно при работе с ответами API, поскольку вы не контролируете данные, поэтому не можете быть уверены, что все поля будут присутствовать.Вместо того, чтобы выдавать ошибку, если вы столкнетесь с такими данными, вы получите nil, чтобы избежать взлома последующего кода.

Надеюсь, это поможет - дайте мне знать, как вы справляетесь, или если у вас есть какие-либо вопросы:)

...