Считывание ассоциативного массива из json в $POST


Я использую jQuery для публикации объекта json в своем php-приложении.

jQuery.post("save.php",JSON.stringify(dataToSend), function(data){ alert(data); });

Строка json, извлеченная из firebug, выглядит так

{ "data" : [ { "contents" : "This is some content",
        "selector" : "DIV.subhead"
      },
      { "contents" : "some other content",
        "selector" : "LI:nth-child(1) A"
      }
    ],
  "page" : "about_us.php"
}

В php я пытаюсь превратить это в ассоциативный массив.

Мой php-код до сих пор

<?php
$value = json_decode(stripcslashes($_POST));
echo $value['page'];
?>

Ответ на вызов ajax должен быть "about_us.php "но он возвращается пустым.

Author: Ryan, 2011-04-27

6 answers

Вы можете избежать использования JSON.stringify и json_decode:

jQuery.post("save.php", dataToSend, function(data){ alert(data); });

И:

<?php
echo $_POST['page'];
?>

Обновление:

... но если вы действительно хотите их использовать, то:

jQuery.post("save.php",  {json: JSON.stringify(dataToSend)}, function(data){ alert(data); });

И:

<?php
$value = json_decode($_POST['json']);
echo $value->page;
?>
 15
Author: Francesco Terenzani, 2011-04-27 16:06:49

$_POST не будет заполнено, если тело запроса не находится в стандартной форме URL-адреса.

Вместо этого прочитайте из доступного только для чтения php://input потока вот так, чтобы получить исходное тело запроса:

$value = json_decode(file_get_contents('php://input'));
 86
Author: Evert, 2012-09-11 08:04:10

Передайте второй аргумент как true, если вам нужен ассоциативный массив, иначе он будет продолжать возвращать объект.

$value = json_decode(stripslashes($_POST),true);
 3
Author: Shakti Singh, 2011-04-27 15:59:18

Попробуйте:

echo $value->page;

Поскольку поведение json_decode по умолчанию заключается в возврате объекта типа stdClass.

В качестве альтернативы задайте второй необязательный аргумент $assoc равным true:

$value = json_decode(stripslashes($_POST), true);
echo $value['page'];
 1
Author: karim79, 2011-04-27 15:58:31

Похоже, что jQuery может кодировать объект javascript в виде URL-адреса, а затем будет заполнен в $_POST. По крайней мере, из их примеров. Я бы попробовал передать ваш объект в post(), не вводя его в строку.

 1
Author: Paul DelRe, 2011-04-27 16:01:22

Если вы хотите использовать данные json в качестве ассоциативного массива, вы можете попробовать следующее:

<?php 

$json = 'json_data'; // json data

$obj = jsondecode($json, true); // decode json as associative array 

// now you can use different values as 
echo $obj['json_string']; // will print page value as 'about_us.php' 


for example: 

$json = { "data" : [ { "contents" : "This is some content",
    "selector" : "DIV.subhead"
   },
   { "contents" : "some other content",
    "selector" : "LI:nth-child(1) A"
   }
  ],
"page" : "about_us.php"
}

$obj = json_decode($json, true); 

/* now to print contents from data */

echo $obj['data']['contents']; 
 // thats all 
?>
 0
Author: Mukesh, 2016-08-05 10:05:57