2013-04-13 3 views
30

Im пытается передать массив mulitidimensional Javascript на другую страницу на моем сайте по:как использовать JSON.stringify и json_decode() правильно

  • с использованием JSON.stringify на массиве

  • присваиваемого полученное значение в поле ввода

  • разместить это поле на вторую страницу

  • с использованием json_d ecode на публикуемую значение

  • затем var_dump испытать

  • (echo'ing посланной переменную непосредственно только, чтобы увидеть, если он пришел через на всех)

Javascript на первой странице :

var JSONstr = JSON.stringify(fullInfoArray); 
document.getElementById('JSONfullInfoArray').value= JSONstr; 

PHP на второй странице:

$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

+3

Проверьте содержимое '$ _POST [ "JSONfullInfoArray"]'. Если что-то не разбирается, 'json_code' просто вернет' null'. Также используйте 'json_last_error()', чтобы попытаться найти то, что пошло не так. – Bart

+1

Немного HTML-формы формы тоже помогут. Просмотрите запрос, используя инспектор вашего браузера, вы видите, чего вы ожидаете? – SuperSaiyan

+0

@Bart см. Править выше, вы получили меня там, где мне нужно было, набросились на ответ, и я принимаю его :), большое спасибо – DelightedD0D

ответ

17

Вы будете d, чтобы проверить содержимое $_POST["JSONfullInfoArray"]. Если что-то не разобратся json_decode просто вернет null. Это не очень полезно, поэтому, когда возвращается null, вы должны проверить json_last_error(), чтобы получить больше информации о том, что пошло не так.

16

Когда вы используете строковое кодирование JSON, сначала используйте html_entity_decode перед json_decode.

$tempData = html_entity_decode($tempData); 
$cleanData = json_decode($tempData); 
+1

Стоит отметить в wp. Я использовал вышеперечисленное с stripslashes внутри html_entity_decode, чтобы сделать работу: – ThisGuyHasTwoThumbs

7
stripslashes(htmlspecialchars(JSON_DATA)) 
+0

Я не уверен, почему 'htmlspecialchars()' должен там. Он преобразует символ кавычки ('' ') в' " ', который является средним, не может обрабатываться' json_decode() '. Я уверен, что формат' JSON' должен быть чем-то вроде '{" key ":" value " } ', но с помощью' htmlspecialchars() 'он преобразуется в' {" ключ ": " значение "} 'как получилось' json_decode() 'обрабатывать его? – Bayu

6

Ни один из других ответов не работал в моем случае, скорее всего, потому что массив 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"]); 

И эхо и var_dump были проверены на работу в порядке на образце из более 2000 введенных пользователем наборов данных, которые включали поле URL и длинное текстовое поле, и которые возвращали NULL на var_dump для подмножества, содержащего URL-адреса w с символами ?&#.

+2

Мне также пришлось использовать' urldecode' на PHP для него – Albion

+2

Как указывает @Albion, строка должна быть декодирована URI до вызова 'json_decode'.' json_decode (urldecode ($ _ POST ["JSONfullInfoArray"])); ' – Aurovrata

-1
jsonText = $_REQUEST['myJSON']; 

$decodedText = html_entity_decode($jsonText); 

$myArray = json_decode($decodedText, true);` 
0

Когда вы сохраняете некоторые данные с помощью JSON.stringify(), а затем необходимо прочитать это в php. Следующий код работал для меня.

json_decode(html_entity_decode(stripslashes ($jsonString))); 

Благодаря @Thisguyhastwothumbs

Смежные вопросы