如何从 PHP 中获取 JSON 值?
Posted
技术标签:
【中文标题】如何从 PHP 中获取 JSON 值?【英文标题】:How to get JSON value from PHP? 【发布时间】:2021-06-17 11:17:26 【问题描述】:我正在尝试从 php 获取 JSON 值,但如果其中一个属性值包含正斜杠“/”,则会失败(我正在使用 GET 来发送此特定场景的数据)。
这是我发送数据的方式(当我不发送“/”时,这很好用)。
用户界面方面
const dataObj =
description: 'my / description',
buyer: 'Mike Brown'
;
const dataString = JSON.stringify(dataObj);
fetch(`http://localhost:8000/clients/$dataString`)
.then((response) => response.text())
.then((responseData) =>
......
);
PHP端:
Route::get('/clients/data', function($data)
// This line below fails ONLY if value of description property contains "/"
// otherwise it works just fine
$dataToBeSaved = json_decode($data, true);
);
是的,我对 json_decode 做了一些研究,但没有很清楚。谁能指出我正确的方向?提前非常感谢!
【问题讨论】:
试试这样,对我有用:$personJSON = '"name":"Johny / Carson","title":"CTO"'; $person = json_decode($personJSON); echo "Name: ". $person->name . '<br/>'; echo "Title: ". $person->title;
您需要将其作为获取请求发送吗?如果您可以将其作为发布请求发送,这将更容易
您解决了这个问题吗?
【参考方案1】:
在 URL 中传递 JSON 数据并不是一个好主意,而且您不能直接这样做,因为它会包含在 URL 中有意义的字符(例如 /、?、= 等)。但如果你必须有几个选择:
-
您可以对字符串进行 URL 编码并将其作为参数传递。这不适用于您拥有的路线,但它的好处是不需要做任何其他事情。您可以从参数中获取值。
const dataObj =
description: 'my / description',
buyer: 'Mike Brown'
;
const dataString = encodeURIComponent(JSON.stringify(dataObj));
console.log(`https://example.com/clients?data=$dataString`);
-
或者您可以对其进行base64 编码。默认情况下,这不会创建 URL 安全字符串,因此您必须替换一些字符以使其成为 URL 安全的。这也意味着您必须在服务器上执行相反的操作。此解决方案适用于您的路线。
const base64UrlEncode = function(str)
return btoa(str)
// this character have meaning in URLs so we need to replace them
// with something else. we'll have to reverse this on the server.
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
;
const dataObj =
description: 'my / description',
buyer: 'Mike Brown'
;
const dataString = base64UrlEncode(JSON.stringify(dataObj));
console.log(`https://example.com/clients/$dataString`);
并在服务器上解码:
function base64UrlDecode($encodedStr)
// undo the character replacements we did when encoding the string
$unreplace1 = str_replace('-', '+', $encodedStr);
$unreplace2 = str_replace('_', '/', $unreplace1);
return base64_decode($unreplace2);
Route::get('/clients/data', function($data)
$dataToBeSaved = json_decode(base64UrlDecode($data), true);
);
使用此解决方案需要注意的一点是,Web 服务器通常对 URL 的长度有限制(例如 Apache 的默认值为 8,177 个字符)。此外,URL 中的“文件名”(路径中的最后一个组件)的大小通常有限制。 Apache 的默认值为 255 个字节/字符。因此,如果您的 base64 编码 JSON 长度超过 255 个字符,它将无法正常工作。更好的解决方案是将数据作为请求正文的一部分(即作为 POST 请求)传递。这样您就没有限制,并且除了将其转换为 JSON 之外,您无需对其进行编码。
【讨论】:
我尝试了您的第一个解决方案,但没有成功,btoa 是什么?似乎也不起作用 @progx 当您说“它不起作用”时,怎么会这样?您是否在服务器端获得了 $data 值?它看起来像什么? btoabase64 编码一个字符串。 @progx 我意识到您不能对字符串进行 URI 编码以使其成为 URL 路径的一部分。您必须将其作为 URL 参数传递。我相应地更新了我的答案。虽然 base64 解决方案应该适用于您拥有的路线。我刚刚在我的服务器上进行了测试,它工作正常。 @progx 我还在答案末尾添加了有关 URL 限制的注释。在将 JSON 数据作为 URL 路径的一部分传递时,您可能会遇到这种情况。 顺便说一句,对不起,我出于某种原因不小心标记了progx
。以上是关于如何从 PHP 中获取 JSON 值?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 php 获取数据以添加 vue 的 json 数据?
如何在 php foreach 循环中从 json obj 获取值
请问PHP如何解析这样的json值?如何获取其中某个值内容呢? 代码如下: