Я использую внешний API для получения информации с другого сайта. У меня есть действительный JSON, хранящийся в переменной экземпляра с именем @result. Однако, передавая его в представление, JavaScript не распознает, что это JSON.
Я пробовал следующее:
var data = JSON.stringify('<%= @result %>');
var apiData = JSON.parse(data);
Где структура @result такова:
[{"name"=>"VONDERSAAR, FRANK J", "fec_id"=>"H4AK00057", "pcc"=>"C00503896", "party"=>"D", "candidate_url"=>"/candidate/2014/vondersaar-frank-j/H4AK00057/", "race_url"=>"/race/2014/H/AK/00/", "ie_url"=>"/outside-spending/#?ordering=-expenditure_date_formatted&candidate_id_checked=H4AK00057", "is_incumbent"=>false, "cycle"=>"2014", "not_seeking_reelection"=>false, "other_office_sought"=>nil, "other_fec_id"=>nil, "election_year"=>2014, "state"=>"AK", "office"=>"H", "office_district"=>"00", "term_class"=>nil, "candidate_status"=>"LP", "total_expenditures"=>"0.00", "expenditures_supporting"=>"0.00", "expenditures_opposing"=>"0.00", "total_receipts"=>"500.00", "total_contributions"=>"0.00", "total_disbursements"=>"400.00", "cash_on_hand"=>"100.00", "cash_on_hand_date"=>"2014-07-31", "district"=>{"race_name"=>"2014 AK-00 (House)", "state"=>"AK", "office"=>"H", "office_district"=>"00", "term_class"=>nil, "id"=>541}, "outstanding_loans"=>"500.00", "cand_is_gen_winner"=>false, "status"=>"Lost in primary"}]
Если я попытаюсь получить доступ к атрибуту «имя» через:
console.log(apiData[0]["name"]);
Это дает мне
undefined
Еще одна попытка:
var apiData = JSON.parse("<%= @result %>");
Это дает мне:
Uncaught SyntaxError: missing ) after argument list
Я также пытался экранировать "", но не понял синтаксиса правильно.
Я знаю, что JSON действителен, потому что я прекрасно использую его с остальной частью моего приложения. Проблема заключается в передаче JavaScript. Он рассматривает его как строку и не будет правильно анализировать ее.
Изменить
Я должен добавить, что в моем контроллере я уже анализирую api_result в JSON через Ruby.
api_result = [api call]
base = JSON.parse(api_result)
@result = base["results"]
Решение
Я заставил его работать со следующим. Контроллер:
api_result = [raw request]
@result = api_result.to_json
Вид:
var apiData = <%= @result.to_json %>;
Спасибо всем за помощь.
var apiData = <%= @result %>;
. Первая попытка не сработает, так как вы конвертируете строку в JSON, а не массив или объект. Анализ этой закодированной строки снова вернет строку, т. е.apiData
— это строка.apiData[0]["name"]
затем получить доступ к свойствуname
первого символа строки, конечно, не существует. Второй не работает, потому что вы генерируете недопустимый JavaScript. Вероятно, это сработало бы, если бы вы использовали одинарные кавычки. Но опять же, вы можете просто вводить данные непосредственно в JS. - person Felix Kling   schedule 06.06.2015