如何从 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中将json数组值声明为变量

如何在 php foreach 循环中从 json obj 获取值

请问PHP如何解析这样的json值?如何获取其中某个值内容呢? 代码如下:

PHP:如何从 JSON 中获取变量(从 Swift iOS 应用程序发送)并以 JSON 响应

PHP、XML 获取记录节点和值并将它们放入 JSON 数组? [复制]