WedX - журнал о программировании и компьютерных науках

Javascript не может получить данные JSON из PHP

У меня возникла небольшая проблема с чтением данных JSON, которые я генерирую в PHP, а затем возвращаю обратно в свой Javascript, и я не знаю, почему.

Вот PHP:

header("content-type: text/json");

curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

//execute post
$result = curl_exec($ch);
// echo the result as a JSON object
echo json_encode($result);

А вот и джавскрипт:

$.post("payment_do.php", { "token": response.response.token, "ip_address": response.ip_address}).done(function(data) {
    console.log(data);
});

Кажется, что если я уберу строку заголовка в PHP, я получу ответ, который я могу прочитать в Javascript, но я не могу получить доступ ни к одному из элементов, как вы ожидаете. Если я оставлю заголовок там, я не получу ответа, читаемого javascript.

РЕДАКТИРОВАТЬ: теперь получение ответа от php выглядит так:

"{\"response\":{\"token\":\"ch_9knTXHoU0dVZsl7iMHyHGg\",\"success\":true,\"amount\":9900,\"currency\":\"AUD\",\"description\":\"test\",\"email\":\"[email protected]\",\"ip_address\":\"1.1.1.1\",\"created_at\":\"2013-03-18T23:49:12Z\",\"status_message\":\"Success!\",\"error_message\":null,\"card\":{\"token\":\"test_token\",\"display_number\":\"XXXX-XXXX-XXXX-0000\",\"scheme\":\"master\",\"address_line1\":\"123 Fake Street Fakington\",\"address_line2\":null,\"address_city\":\"moon\",\"address_postcode\":\"2121\",\"address_state\":\"NSW\",\"address_country\":\"Australia\"},\"transfer\":[],\"amount_refunded\":0,\"total_fees\":999,\"merchant_entitlement\":999,\"refund_pending\":false}}"

В конце концов мне пришлось удалить функцию json_encode в php и просто вернуть результат. Затем в javascript (используя jQuery) я назвал:

data = $.parseJSON(data);

С помощью которого я мог бы получить доступ к элементам объекта.


Ответы:


1

Измените заголовок на application/json (вместо text/json). Кроме того, если вы действительно хотите дополнительно обработать результаты вызова curl_exec, вам необходимо установить дополнительную опцию:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

Это приведет к тому, что вызов curl_exec будет возвращать данные в случае успеха, а не TRUE.

$result = curl_exec($ch);
if(! $result) {
    // handle error
}

echo json_encode($result);

Кроме того, вы захотите проверить данные, которые вы получаете от вызова cURL — убедитесь, что их действительно нужно закодировать, прежде чем возвращать.

18.03.2013
  • Спасибо, я пробовал это. Я все еще получаю сообщение об ошибке, когда я не вижу JSON. Я просто не получаю ответа в javascript, как только я прокомментирую эту строку. Я вижу ответ JSON, но не могу получить доступ ни к одному из элементов. 19.03.2013
  • Итак, вы видите, что данные JSON возвращаются в качестве ответа в консоли, но вы не можете их использовать? Это справедливое заявление? 19.03.2013
  • Да, точно. Кажется, что cURL возвращает данные без моего явного указания. Переменная $result просто true, которая кодируется как 1 с помощью json_encode. 19.03.2013
  • @rheotron - хорошая дополнительная информация. Я отредактировал свой ответ, чтобы отразить некоторые дополнительные вещи, которые вам, вероятно, потребуется реализовать. 19.03.2013
  • Да - это работает сейчас. Я могу получить правильные данные из cURL. Единственная проблема, с которой я столкнулся сейчас, заключается в том, что cURL, кажется, вставляет много косых черт и, похоже, возвращается в Javascript в виде строки даже с json_encode. Любые идеи? 19.03.2013
  • Не могу сказать, не видя данных. Запишите результат вызова curl_exec и добавьте его часть к своему вопросу. 19.03.2013
  • На самом деле я хотел увидеть результаты вызова curl_exec, а не данные, которые получает клиент. Однако я думаю, что ваш вызов json_encode не нужен. Вы должны быть в состоянии просто echo $result и все будет в порядке. 19.03.2013

  • 2

    Добавь это:

    header("Content-Type: application/json");
    echo json_encode($result);
    
    18.03.2013
    Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]