PHP努力解码JSON

时间:2014-07-28 08:05:51

标签: php laravel json

我有通过cURL调用脚本的脚本。它看起来像这样,

Route::get('login-redirect', function() {

if (Input::has('error')) {

    return Input::get('error_description');
}
if (Input::has('code')) {

   $fields = array(
        'grant_type' => 'password',
        'username' => 'admin@local.com',
        'password' => 'passwohrd',
        'client_id' => 'testclient'
   );

   $fieldstring = http_build_query($fields, "\n");

   $url = "http://apitest.local/api/v1/get-token";

   $ch = curl_init();

   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_POST, count($fields));
   curl_setopt($ch, CURLOPT_POSTFIELDS, $fieldstring);

   $result = curl_exec($ch);

   $json = json_decode($result);

   curl_close($ch);

   $fields = array('access_token' => '3c1e6b099f172fc01304403939edf8e56904ab61');
   $fieldstring = http_build_query($fields, "\n");

   $url = "http://apitest.local/api/v1/me";

   $ch = curl_init();

   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_POST, count($fields));
   curl_setopt($ch, CURLOPT_POSTFIELDS, $fieldstring);

   $result = curl_exec($ch);

   curl_close($ch);

   dd($result);

}

如果我dd($json)

,则返回的json看起来像这样

{"content":null,"error":true,"error_description":"Invalid username and password combination"}int(1)

我觉得在通过json_decode运行之后我应该能够输出$json->error但是没有。

JSON是在下面的类中创建的,但我在这里看不到任何奇怪的东西,我做错了,还是我误解了json_decode?

<?php
namespace Shaunpersad\ApiFoundation\Http;

use App;
use Response;

class ErrorResponse
{
    public static function make($message = '', $status = 200, array $headers = array(), $options = 0)
    {
        $response = App::make(
            'api_response_array',
            array(
                'content' => null,
                'error' => true,
                'error_description' => $message
            )
        );

        return Response::json($response, $status, $headers, $options);
    }
} 

3 个答案:

答案 0 :(得分:1)

首先,你没有CURLOPT_RETURNTRANSFER - 你的curl_exec直接将输出缓冲区返回到屏幕。

其次,看起来你在某处有var_dump而且我看不到哪里:)

第三,你没有问过任何直接的问题。

修改

好的,我已经读过几次,并在下面回答。 dd()函数确实是一个var_dump包装器,但它将var_dump数据转储为json格式的afaics。

答案 1 :(得分:0)

<强>更新

如其他答案所述,由于您尚未设置CURLOPT_RETURNTRANSFER,因此您实际上并未收到输出。因此,当curl_exec()请求成功运行时,1将回显对DOM的响应并返回true( curl )。

您可以通过在某处的curl请求中设置此项来运行以下内容:

curl_setop(CURLOPT_RETURNTRANSFER, true);

dd()laravel function,这就是文档所说的内容:

  

转储给定变量并结束脚本执行。

我认为它只是一个更美观的包装函数var_dump() 因为我不使用laravel,我不知道它的确切输出 )。

您想要的是解码从$result返回的cUrl。这样的事情就足够了:

$data = json_decode($result);

echo $data->error_description;

成功解码的对象如下所示:

stdClass Object
(
    [content] => 
    [error] => 1
    [error_description] => Invalid username and password combination
)

Example


您甚至可以现在测试您的布尔error值:

if($data->error) {
    //....true
} else {
    //....false
}

答案 2 :(得分:0)

您输出的内容不是来自dd($json)

// this part has been output by curl_exec():
{"content":null,"error":true,"error_description":"Invalid username and password combination"}
// only this part comes from dd($json):
int(1)

原因如下:

// no CURLOPT_RETURNTRANSFER, so curl_exec() outputs result and returns true:
$result = curl_exec($ch);

// thus $result = true;

// so here $json = 1, since this is what json_decode(true) will return
$json = json_decode($result);

// then you did dd($json), so it just appended var_dump(1) to the output:
{"content":null,"error":true,"error_description":"Invalid username and password combination"}int(1)