В JSON и json_decode в PHP и JavaScript - PullRequest
       26

В JSON и json_decode в PHP и JavaScript

3 голосов
/ 04 марта 2010

Я пытаюсь передать объект JavaScript в скрипт PHP через jquery.ajax(), в основном:

var bigArray = new Object();
//Dode
//Start loop
bigArray[x] = {name: exname, id: exID, order:e, set: setBox, inc: incBox, example: exampleBox, day: i};

Так что это в значительной степени массив этих объектов.

    var anotherTest = $.toJSON(bigArray);
    var ajxFile = "routineajax.php";
    $.ajax({
        type: 'POST',
        processData: false,
        url: ajxFile,
        data: anotherTest,
        success: function(data) {
            $('#result').html(data);
            alert('Load was performed.');
        }
    });
});

Сценарий PHP

 print_r($_POST);
 $params = json_decode($_POST);
 print_r($params)

Идет вызов Ajax, и я вижу в Firebug , но print_r($_POST) возвращает пустой массив. Хотя, если я изменю его на $_GET как в функции $.ajax, так и в скрипте PHP, это сработает. Моя основная проблема - это сообщение об ошибке:

Предупреждение: json_decode () ожидает, что параметр 1 будет строкой, массив указан в

Как мне решить эту проблему?


После добавления этого фрагмента в файл PHP

  $data = file_get_contents('php://input');
  var_dump($data);
  var_dump(json_decode($data));

Я получаю этот вывод

string'{"0"{"name":"Decline`Abs","id":"54","order":0,"set":"","inc":"","example":"","day":1}}' (length=87)`
  object(stdClass)[2]
      public '0' =>
        object(stdClass)[4]
          public 'name' => string 'Decline Abs' (length=11)
          public 'id' => string '54' (length=2)
          public 'order' => int 0
          public 'set' => string '' (length=0)
          public 'inc' => string '' (length=0)
          public 'example' => string '' (length=0)
          public 'day' => int 1

Так что, по крайней мере, это происходит, хотя я не уверен, как получить к нему доступ, шаг в правильном направлении!

Ответы [ 3 ]

3 голосов
/ 05 марта 2010

Мне кажется, проблема в том, что обычно данные POST отправляются в кодировке key=value&key2=value2, а вы отправляете их в формате JSON.Попробуйте получить доступ к необработанным данным поста следующим образом:

$data = file_get_contents('php://input');
var_dump($data);
var_dump(json_decode($data));

и посмотрите, работает ли это.Если нет, пожалуйста, напишите в своем вопросе, что он возвращает, если что-нибудь.


На основе комментария ниже и дополнений к ОП.

Сделал var_dump из $data правильно скопировать и вставить?Причина, по которой я спрашиваю, заключается в том, что это: string'{"0"{"name" мне не подходит.Это не правильный JSON или правильно закодированная строка POST.Возможно, некоторые символы были закодированы при копировании и вставке.

В любом случае, теперь вы получаете нужный результат.stdClass - это просто пустой контейнер, в который он помещает данные, к которым вы можете получить доступ, используя обычный синтаксис объекта.В этом случае вам придется сделать $data->{0}->name Я думаю, из-за этого 0.Если вы сделаете $data = json_decode($data, true), это будет ассоциативный массив, и вы можете получить доступ к данным POST как $data[0]['name'].

Если вы хотите продолжать исследовать это, может быть полезно показать результатывыполняйте window.console.dir(data) прямо перед выполнением запроса ajax и убедитесь, что при var_dump(data) вы просматриваете источник страницы для копирования и вставки.window.console.dir(data) покажет свойства data в окне Firebug (вы используете Firebug, верно?).Это также работает в отладчике Chrome и, возможно, других.Как я уже сказал, похоже, вы, вероятно, уже получаете то, что вам нужно, поэтому расследование не нужно.

0 голосов
/ 04 марта 2010

Превратить processData в истину. Я не верю, что ваш JSON проходит правильно. Также обратите внимание, что он не будет проходить как json, а пары ключей и значений вашего JSON будут содержимым $_POST, когда вы к нему придете.

Кроме того, можно ли легко преобразовать значения вашего bigArray в строку? Если вы передаете элементы DOM или что-то еще, у вас будут проблемы.

0 голосов
/ 04 марта 2010

Разве это не достаточно ясно? json_decode() ожидает, что параметр один будет строкой, а не массивом. Но $_POST и $_GET всегда являются массивами. Вы можете передать член этого массива в json_decode().

Чтобы увидеть содержимое массива, используйте этот фрагмент:

<code>echo "<pre>";
print_r($_GET);
echo "
";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...