jquery — недопустимое переполнение стека данных JSON

Я сгенерировал 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) "" } }

2

Решение

Ваша проблема в том, что $_POST это массив, вы на самом деле хотите сделать

json_decode($_POST[0]);

Для того, чтобы декодировать только первый объект в вашем массиве записей.

Однако вы быстро заметите, что это тоже не сработает; $_POST Массив ожидает, что вы передадите объект JSON значения ключа или массив. В вашем случае вы проходите через объект json, но он становится странно отформатированным, потому что вы не проходите через ключ. Я не совсем уверен в этом, но судя по вашему var_dumpЯ уверен, что проблема в том, что вы не передаете его в массив. Я также хотел бы отметить, что если вы установите правильные заголовки и просто передадите объект, бэкэнд должен будет прочитать его так же легко, как он читает form-data

2

Другие решения

Ваш 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.

1

Я не знаю, что делает 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
)
0

Можете ли вы попробовать этот код?

 $request = Yii::$app->request->post();
$jsondecode = CJSON::decode($request, true);
print_r($jsondecode);
0
По вопросам рекламы [email protected]