Я сгенерировал Json из knockout.js и создал что-то вроде этого:
{"po":"11446019431405","orders":[{"product":{"ID":"2","product_name":"A","product_code":""},"ID":"2","product_name":"A","product_code":"","price":"11","qty":1,"discount":0,"subtotal":11,"amount":11},{"product":{"ID":"1","product_name":"B","product_code":""},"ID":"1","product_name":"B","product_code":"","price":"10","qty":1,"discount":0,"subtotal":"10","amount":10}],"grandTotal":21}
Я пробовал json_decode и Json :: decode из Yii, но это не сработало. Что пошло не так? Есть ли особый способ разобрать это в PHP?
Ниже мой код для справки.
Мой код Javascript:
$.post(url, ko.toJSON(orderCollection), {}, "json");
В своем php-коде я попытался использовать $ _POST и Yii :: $ app-> request-> post (), но оба не удалось
public function actionPostorders() {
$request = Yii::$app->request->post();
echo Json::decode($request);
}
Моя ошибка при использовании Json :: decode:
PHP Warning 'yii\base\ErrorException' with message 'json_decode() expects parameter 1 to be string, array given'
in C:\xampp\yii2\controllers\PurchaseController.php:121
Аналогичная ошибка возникает при использовании ванильного PHP
json_decode($_POST)
PHP Warning 'yii\base\ErrorException' with message 'json_decode() expects parameter 1 to be string, array given'
in C:\xampp\yii2\controllers\PurchaseController.php:121
Это то, что я получаю, когда я теряю свою переменную $ _POST
array(1) { ["{"po":"11446021195934","orders":"]=> array(1) { ["{"product":{"ID":"2","product_name":"A","product_code":""},"ID":"2","product_name":"A","product_code":"","price":"11","qty":1,"discount":0,"subtotal":11,"amount":11},{"product":{"ID":"1","product_name":"B","product_code":""},"ID":"1","product_name":"B","product_code":"","price":"10","qty":1,"discount":0,"subtotal":"10","amount":10}"]=> string(0) "" } }
Ваша проблема в том, что $_POST
это массив, вы на самом деле хотите сделать
json_decode($_POST[0]);
Для того, чтобы декодировать только первый объект в вашем массиве записей.
Однако вы быстро заметите, что это тоже не сработает; $_POST
Массив ожидает, что вы передадите объект JSON значения ключа или массив. В вашем случае вы проходите через объект json, но он становится странно отформатированным, потому что вы не проходите через ключ. Я не совсем уверен в этом, но судя по вашему var_dump
Я уверен, что проблема в том, что вы не передаете его в массив. Я также хотел бы отметить, что если вы установите правильные заголовки и просто передадите объект, бэкэнд должен будет прочитать его так же легко, как он читает form-data
Ваш JSON верен в соответствии с JSLint
{
"po":"11446019431405",
"orders":
[
{
"product":
{
"ID":"2","product_name":"A",
"product_code":""},
"ID":"2",
"product_name":"A",
"product_code":"",
"price":"11","qty":1,
"discount":0,
"subtotal":11,
"amount":11
},
{
"product":
{
"ID":"1","product_name":"B",
"product_code":""},
"ID":"1",
"product_name":"B",
"product_code":"",
"price":"10",
"qty":1,
"discount":0,
"subtotal":"10",
"amount":10
}
],
"grandTotal":21
}
Сжатый:
{"po":"11446019431405","orders":[{"product":{"ID":"2","product_name":"A","product_code":""},"ID":"2","product_name":"A","product_code":"","price":"11","qty":1,"discount":0,"subtotal":11,"amount":11},{"product":{"ID":"1","product_name":"B","product_code":""},"ID":"1","product_name":"B","product_code":"","price":"10","qty":1,"discount":0,"subtotal":"10","amount":10}],"grandTotal":21}
И запустите этот сжатый с JSLint, ничего не пошло не так. Так что это может пойти не так с вашей обработкой JSON.
Я не знаю, что делает Json :: decode, но со стандартным php он должен возвращать объект, поэтому вы не можете отобразить объект или массив, попробуйте напечатать переменную типа print_r или var_dump следующим образом.
$json = '{"po":"11446019431405","orders":[{"product":{"ID":"2","product_name":"A","product_code":""},"ID":"2","product_name":"A","product_code":"","price":"11","qty":1,"discount":0,"subtotal":11,"amount":11},{"product":{"ID":"1","product_name":"B","product_code":""},"ID":"1","product_name":"B","product_code":"","price":"10","qty":1,"discount":0,"subtotal":"10","amount":10}],"grandTotal":21}';
print_r( json_decode($json));
результат
stdClass Object
(
[po] => 11446019431405
[orders] => Array
(
[0] => stdClass Object
(
[product] => stdClass Object
(
[ID] => 2
[product_name] => A
[product_code] =>
)
[ID] => 2
[product_name] => A
[product_code] =>
[price] => 11
[qty] => 1
[discount] => 0
[subtotal] => 11
[amount] => 11
)
[1] => stdClass Object
(
[product] => stdClass Object
(
[ID] => 1
[product_name] => B
[product_code] =>
)
[ID] => 1
[product_name] => B
[product_code] =>
[price] => 10
[qty] => 1
[discount] => 0
[subtotal] => 10
[amount] => 10
)
)
[grandTotal] => 21
)
Можете ли вы попробовать этот код?
$request = Yii::$app->request->post();
$jsondecode = CJSON::decode($request, true);
print_r($jsondecode);