HTTPArty/Rails: как обрабатывать массив ответов

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

[{"param1":1,"param2":"blah1"},
{"param1":2,"param2":"blah2"},
{"param1":3,"param2":"blah3"}]

Вот я пытаюсь вызвать API и распечатать параметр первого объекта ответа JSON.

result = HTTParty.get('http://randomapi.com',query: options)
@a = result[0]['param1']
# puts "#{result}"
puts "#{@a}"

При этом ничего не печатается. Я знаю, что я успешно обращаюсь к URL-адресу, потому что в результате будет напечатана правильная информация.

Я получил информацию о том, как получить доступ к ответу JSON по этому URL-адресу http://blog.teamtreehouse.com/its-time-to-httparty

Изменить: прочитав комментарии ниже, я понял, что вызов API возвращает тип содержимого text/html, а синтаксический анализ text/html не работает, поскольку ответ также возвращает следующий заголовок ниже ожидаемого значения. . Есть ли способ удалить это, не заходя в саму строку и не удаляя ее?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html 
    xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body>
        <form method="post" action="GetRankingList.aspx?pvptype=1&amp;sid=1&amp;tm=20130821160000&amp;auth=77c9b582c3aed3d3974400cfb118fe4b" id="form1">
            <div class="aspNetHidden">
                <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjlkZLSAAAtd4/lj1u6b0GjPWM+p3i9tqI6sq+xDrRw2cAv3" />
            </div>
            <div></div>
        </form>
    </body>
</html>

person user2158382    schedule 23.08.2013    source источник


Ответы (3)


Похоже, API возвращает ответ с Content-Type, отличным от application/json. Вы можете проверить это, распечатав:

puts result.content_type

Если это так, синтаксический анализатор HTTPy может интерпретировать ответ как обычный текст; И, таким образом, код result[0]['param1'] оценивается как nil Может быть, вы можете попытаться разобрать желаемое значение на @a с помощью:

@a = JSON.parse(result)[0]['param1']

Не забудьте потребовать библиотеку json

require 'json'

Удачи!

person marcelrf    schedule 23.08.2013
comment
Спасибо, вы помогли мне понять, что он не возвращает правильный формат JSON. Я попробовал ваше решение, но оно не работает в этом случае. Я даю более подробную информацию в редактировании, которое я только что сделал - person user2158382; 23.08.2013
comment
Я не знаю особенностей используемого вами API. Возможно, API неверен, или, может быть, вы могли бы назвать его так, чтобы он возвращал только ожидаемый json (без дополнительного html). Если вы, наконец, решите удалить заголовок, вы можете использовать: result[0...result.index('<!DOCTYPE')]. Ваше здоровье! - person marcelrf; 23.08.2013
comment
Я решил просто снять заголовок. Спасибо!! - person user2158382; 23.08.2013

Вам нужно проанализировать parsed_response из результата.

@parsed = JSON.parse(result.parsed_response)
person nyzm    schedule 23.08.2013

при доступе к json с форматом

require 'json'
result = JSON.parse('[{"param1":1,"param2":"blah1"},{"param1":2,"param2":"blah2"}, {"param1":3,"param2":"blah3"}]')
@a = result[0]["param1"]
puts @a
person akbarbin    schedule 23.08.2013