当json_decode、stripslashes等解决方案都不起作用时,如何在php中解析json?
Posted
技术标签:
【中文标题】当json_decode、stripslashes等解决方案都不起作用时,如何在php中解析json?【英文标题】:How to parse json in php when json_decode, stripslashes and other solutions are not working? 【发布时间】:2022-01-17 00:16:39 【问题描述】:我知道此类问题已在此论坛上多次提出,但我查看了该问题的无数变体并尝试了许多不同的解决方案,但都没有奏效,所以我想我会粘贴我的实际代码以防我完全错过了什么。所以我正在访问 CRM 的 API 并接收 json 输出。输出如下:
"access_token":"415db7610058604900566bdd","expires":1639406913,"expires_in":3600,"scope":"granted_permission","domain":"bitrix24.com","server_endpoint":"https:\/\/oauth.bitrix.info\/rest\/","status":"L","client_endpoint":"https:\/\/bitrix24.com\/rest\/","member_id":"**************","user_id":8,"refresh_token":"31dcde610058604900566bdd00000008f0f1037319823fdbcad5b438d3098146949075"
这是我使用 cURL 发布 URL 后得到的输出,该 URL 然后允许生成 refresh_token,可以在 json 输出中看到。我必须解析 json 以获得新的刷新令牌,以便在令牌过期时重新输入。
经过研究,我了解到您可以使用 json_decode 函数通过 php 解析 json,我尝试了许多不同的方法,尝试了使用 trim、true、stripslashes 和更多变体的函数。
当我运行下面的代码时,我可以回显 $result 变量并查看 json,但是当我尝试回显从 json 输出中解析的 refresh_token 时,我得到的只是一个空白屏幕,无论哪个我尝试使用的方法,或者即使我使用 var_dump。如果有人能解释我做错了什么,我是否应该导入某种外部库,或者我是否在某处错过了一步,我将不胜感激。
<?php header("Content-Type: application/json; charset=UTF-8");
ini_set("allow_url_fopen", 1);
$client_id = "**********";
$secret_id = "****************";
$refresh_token = "94dade610058604900566bdd00000008f0f103f252c645ad3779a511ca2346b2fe9f27";
$refresh_token2 = "";
if($refresh_token2 == "")
$url = "https://bitrix24.com/oauth/token/?grant_type=refresh_token&client_id=" . $client_id . "&client_secret=" . $secret_id . "&refresh_token=" . $refresh_token . "&scope=granted_permission&redirect_uri=app_URL";
// Initialize a CURL session.
$ch = curl_init();
// Return Page contents.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//grab URL and pass it to the variable.
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
$json = file_get_contents($result);
$obj = json_decode($json, true);
var_dump($obj);
在这里我尝试了@dietcheese 解决方案。我还添加了一个输出屏幕截图,显示它如何不输出 json 值。这就是我之前尝试过在论坛上发布的解决方案的意思(@dietcheese 解决方案就是其中之一)但它们不起作用。
<?php header("Content-Type: application/json; charset=UTF-8");
ini_set("allow_url_fopen", 1);
$client_id = "**************";
$secret_id = "**************";
$refresh_token = "250be0610058604900566bdd";
$refresh_token2 = "";
if($refresh_token2 == "")
$url = "https://bitrix24.com/oauth/token/?grant_type=refresh_token&client_id=" . $client_id . "&client_secret=" . $secret_id . "&refresh_token=" . $refresh_token . "&scope=granted_permission&redirect_uri=app_URL";
// Initialize a CURL session.
$ch = curl_init();
// Return Page contents.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//grab URL and pass it to the variable.
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
echo "This is the result variable being echoed: \n\n" . $result;
curl_close($ch);
$json = json_decode($result, true);
echo "\n\n\nHere the json should print: \n\n";
print_r($json);
echo "\n\nHere the refresh token should echo: \n\n";
echo $json['refresh_token'];
以下是输出:
这就是我问这个问题的原因,因为我真的很困惑,什么都不起作用。
【问题讨论】:
"...但是当我尝试回显从 json 输出中解析的 refresh_token..." 我在该代码中看不到任何内容除了通过var_dump
将其转储外,对解析结果做任何事情。您认为您从该代码中的何处/如何获取 refresh_token?
为什么在 JSON 响应中使用file_get_contents()
?
$json = file_get_contents($result);
但$result
不是文件名,它是包含 cURL 调用结果的字符串
为免生疑问,该 JSON 没有任何问题。 json_decode
将成功解码它,在结果上使用$obj->refresh_token
将为您提供refresh_token
。所以问题在于获取 JSON,可能是因为上面列出的问题之一。
您没有说出json_decode()
返回的内容,也没有询问或检查 JSON 解码错误。空白屏幕通常意味着您的开发框未配置为显示错误。鉴于您不知道 PHP 抱怨什么,错误可能在您的代码库中的任何地方。
【参考方案1】:
你为什么要使用
$json = file_get_contents($result);
在你的 curl_close($ch) 语句之后,尝试添加:
$json = json_decode($result, true);
print_r($json);
如果可行,您应该可以执行以下操作:
echo $json['refresh_token'];
【讨论】:
【参考方案2】:所以我发现了问题。感谢@ÁlvaroGonzález 提醒我应该在我的代码箱中进行调试。 (我知道菜鸟动作,但我还是菜鸟)。
开启调试后,发现php连json_decode都不识别。然后为 PHP 安装 JSON 模块后,一切正常。
【讨论】:
以上是关于当json_decode、stripslashes等解决方案都不起作用时,如何在php中解析json?的主要内容,如果未能解决你的问题,请参考以下文章