如何将Javascript JSON.stringify()转换为PHP数组



我已经绞尽脑汁2天了,来来回回寻找这个问题的解决方案,请给我一个启发:

我有这个JavaScript代码,包括一个刀片文件,并通过它传递数据。

const loadTemplate = (locationinfo) => {
let info = `
<div class="location-info">
<h1>${locationinfo.business_name}</h1>
@include('pages/business-space/templates/t1',[
'locationinfo'=>'${JSON.stringify(locationinfo)}', //this is the code
])
</div>`;
return info;
}

当我在控制台记录JSON.stringify(locationinfo)时,它只是一个普通的json字符串:

{
"id":3,
"business_name":"Wen",
"business_address":"sdfsdf",
"lat":14.764397881407836,
"lng":121.08031105807841,
"is_active":"Yes",
"created_by":null,
"date_created":"2022-06-17 11:09:42"
}

在我的t1.blade.php中如果我回显locationinfo变量它仍然显示相同的:

echo $locationinfo;
//and the result:
{
"id":3,
"business_name":"Wen",
"business_address":"sdfsdf",
"lat":14.764397881407836,
"lng":121.08031105807841,
"is_active":"Yes",
"created_by":null,
"date_created":"2022-06-17 11:09:42"
}

但是当我试图用json_decode解码它时,它变成了null。下面是我的代码:

$arr = json_decode($locationinfo); //this is null
foreach ($arr as $key => $value) {
echo $key;
}

另一个错误:

$arr = json_decode($locationinfo, true);
foreach ($arr as $key => $value) {
echo $key;
}
//error: foreach() argument must be of type array|object, null given

为什么会发生这种情况?提前谢谢。

首先确保$locationinfo是一个json字符串。我怀疑这是一个php关联数组

试试echo $locationinfo['id'];。如果value出现,u不想解码它。使用$locationinfo直接不带json解码

如果是json,试着这样使用,

$arr = json_decode($locationinfo, true);

添加一个strip斜杠。

$data = json_decode(stripslashes($data),true);

Demo: http://codepad.org/XX9QD3iX

回答在这里:https://stackoverflow.com/a/37599821/19168006

编辑:示例中有stdClass错误,这是工作的一个:http://codepad.org/lfJJu5yA

你不能把js的数据传递给PHP,因为PHP会先渲染。

但您可以调用ajax并返回blade响应

你的ajax调用

const loadTemplate = (locationinfo) => {
$.ajax({
data: {
'locationinfo': locationinfo,
},
type: "post",
url: "{{route('someRoute')}}",
success: function (data) {
let info = `
<div class="location-info">
<h1>${locationinfo.business_name}</h1>
${data}
</div>`;
return info;
},
error: function () {
//has error
}
});
}

你的路线

Route::get('/getAjaxData', [AjaxController::class,'show']) ->name('someRoute'); // but i use __invoke controller

控制器

<?php
namespace YOUR_NAMESPACE;
use AppHttpControllersController;
use IlluminateHttpRequest;
class AjaxController extends Controller
{
public function show(Request $request)
{
$data = $request->input('locationinfo');
return view('pages/business-space/templates/t1')->with([
'locationinfo' => $data,
]);
}
}

最新更新