当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-&gt;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?的主要内容,如果未能解决你的问题,请参考以下文章

php json_decode 返回空

php中怎么把json双引号前加上转义符\

IP定位,天气接口

json数据前后端传输

php中urldecode()和urlencode()和stripslashes() 的作用

在 PHP json_decode() 中检测错误的 json 数据?