Как правильно использовать JSON.stringify и json_decode()
Я пытаюсь передать многоуровневый массив Javascript на другую страницу моего сайта:
-
используя JSON.stringify в массиве
-
присвоение результирующего значения полю ввода
-
размещение этого поля на второй странице
-
используя json_decode для опубликованного значения
-
затем var_dump для проверки
-
(echo'ing опубликованная переменная непосредственно, чтобы увидеть, не получилось ли это
вообще)
Javascript на первой странице:
var JSONstr = JSON.stringify(fullInfoArray);
document.getElementById('JSONfullInfoArray').value= JSONstr;
php на странице 2:
$data = json_decode($_POST["JSONfullInfoArray"]);
var_dump($data);
echo($_POST["JSONfullInfoArray"]);
Эхо работает отлично, но var_dump возвращает NULL
Что я сделал неправильно?
Это меня исправило:
$postedData = $_POST["JSONfullInfoArray"];
$tempData = str_replace("\\", "",$postedData);
$cleanData = json_decode($tempData);
var_dump($cleanData);
Я не уверен, почему, но почта проходила с кучей символов "\", разделяющих каждую переменную в строке
Выяснил это с помощью json_last_error()
, как было сказано Бартом, который вернул JSON_ERROR_SYNTAX
Ответы
Ответ 1
Вам нужно проверить содержимое $_POST["JSONfullInfoArray"]
. Если что-то не анализируется, json_decode
просто вернет null
. Это не очень полезно, поэтому, когда возвращается null
, вы должны проверить json_last_error()
, чтобы получить больше информации о том, что пошло не так.
Ответ 2
Когда вы используете JSON stringify, сначала используйте html_entity_decode перед json_decode.
$tempData = html_entity_decode($tempData);
$cleanData = json_decode($tempData);
Ответ 3
stripslashes(htmlspecialchars(JSON_DATA))
Ответ 4
Ни один из других ответов не работал в моем случае, скорее всего, потому, что массив JSON содержал специальные символы. Что исправлено для меня:
Javascript (добавлен encodeURIComponent)
var JSONstr = encodeURIComponent(JSON.stringify(fullInfoArray));
document.getElementById('JSONfullInfoArray').value = JSONstr;
PHP (без изменений)
$data = json_decode($_POST["JSONfullInfoArray"]);
var_dump($data);
echo($_POST["JSONfullInfoArray"]);
Как echo, так и var_dump были проверены на то, чтобы нормально работать с образцом из более чем 2000 введенных пользователем наборов данных, которые включали поле URL и длинное текстовое поле, и которые возвращали NULL в var_dump для подмножества, содержащего URL-адреса с символы ?&#
.