Php JSON_解码从cURL响应返回NULL,即使编码格式似乎正确?

Php JSON_解码从cURL响应返回NULL,即使编码格式似乎正确?,php,json,curl,post,Php,Json,Curl,Post,编辑:对于解决方案,请查看下面Barmar的回复。希望这能帮助任何有类似问题的人。 我正试图从test.php文件中获取一个登录名,并将其卷曲到一个站点,该站点使用数据模拟另一个页面上的登录名(我知道这很乏味,但这并不是我作为一个整体所做的全部工作,只是我遇到了问题)。因此,我将一个编码的json发布到index.php url中,对其进行解码没有问题。然后使用传递的信息并编辑解码的json以显示登录成功或失败。json然后再次编码,并在页面上回响,并保存在test.php上的$contents

编辑:对于解决方案,请查看下面Barmar的回复。希望这能帮助任何有类似问题的人。

我正试图从test.php文件中获取一个登录名,并将其卷曲到一个站点,该站点使用数据模拟另一个页面上的登录名(我知道这很乏味,但这并不是我作为一个整体所做的全部工作,只是我遇到了问题)。因此,我将一个编码的json发布到index.php url中,对其进行解码没有问题。然后使用传递的信息并编辑解码的json以显示登录成功或失败。json然后再次编码,并在页面上回响,并保存在test.php上的$contents中。当我试图在这个文件上解码时,每次都会得到NULL。我已经尝试了很多事情,我开始认为我在某个地方犯了一个愚蠢的错误,所以我在这里拼命寻求帮助

-如果我回显$contents,它将显示:

 {"user":"user","pass":"password","success":true}
-如果I var_dump(trim($contents)),它会显示(格式完全如图所示):

-最后一个错误消息显示:

 SYNTAX ERROR
-我尝试过修剪、utfencoding、iconv、设置卷曲头,以及我在这里看到的其他帖子中推荐的一切

任何帮助都将不胜感激。提前谢谢各位

test.php:

<html>
<head>
    <meta charset="UTF-8">
    <title>TITLE</title>
</head>
<body>
    <form action="test.php" method=POST>
        <input type="text" name="user">
        <input type="password" name="pass">
        <input type="submit" value="Submit">
    </form>

    <?php
    function logInfo(){
        class data{
          public $user = "";
          public $pass = "";
          public $success = false;
        }

        $data = new data();
        $data->user = $_POST['user'];
        $data->pass = $_POST['pass'];
        $ch = curl_init();
        $json = json_encode($data);

        curl_setopt($ch, CURLOPT_URL, [URL TO INDEX.PHP]);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, array("data"=>$json));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        $contents = curl_exec($ch);
        curl_close($ch);

        $array = json_decode($contents, true);
        var_dump($array);
        //VAR_DUMP SHOWS NULL
    }

    if(isset($_POST['user']) && isset($_POST['pass'])){
        logInfo();
    }
    ?>

</body>
</html>

标题
index.php:

<html>
    <head>
            <meta charset="UTF-8">
            <title></title>
    </head>
    <body>
            <form action="test.php" method=POST>
                <input type="hidden" name="data">
            </form>
            <?php
            header('Context-type: application/json');
            function logInfo(){
                    $datastring = $_POST['data'];
                    $data = json_decode($datastring);

                    $ch = curl_init();

                    curl_setopt($ch, CURLOPT_URL, [URL TO SIMULATE LOGIN]);
                    curl_setopt($ch, CURLOPT_POST, 1);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, [LOGIN POST]);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                    curl_exec($ch);
                    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);


                    if($code == [SUCCESSFUL LOGIN HTTP CODE]){
                            $data->success = true;
                    } else {
                            $data->success = false;
                    }

                    echo json_encode($data);
                    curl_close ($ch);
            }
            if(isset($_POST['data'])){
                logInfo();
            }
            ?>
    </body>
</html>

编辑:对于解决方案,请查看下面Barmar的回复。希望这能帮助任何有类似问题的人。

你应该这样做

json_encode(get_object_vars($data));
在logInfo函数中

我想推荐几件事。在函数中定义类不是一个好的做法。你应该将你的类放在一个单独的文件中。它有助于保持代码的条理化

其次,在定义类/方法/函数等时,最好遵循snake-case或camel-case

蛇形案例:我的函数名要执行
Camel case例如:MyFunctionNameToExecute

index.php
在JSON之前打印HTML(当
var\u dump()
说字符串长365个字符,但你只能看到大约50个字符时,你不怀疑吗?)。当脚本用于返回JSON时,它无法生成任何其他输出

因此,在打印任何输出之前,请检查
数据
参数。如果找到了,在发送JSON后退出脚本,这样就不会打印HTML

<?php
if(isset($_POST['data'])){
    logInfo();
    exit();
}
?>
<html>
    <head>
            <meta charset="UTF-8">
            <title></title>
    </head>
    <body>
            <form action="test.php" method=POST>
                <input type="hidden" name="data">
            </form>
            <?php
    </body>
</html>
<?php
function logInfo(){
    header('Context-type: application/json');
    $datastring = $_POST['data'];
    $data = json_decode($datastring);

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, [URL TO SIMULATE LOGIN]);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, [LOGIN POST]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);


    if($code == [SUCCESSFUL LOGIN HTTP CODE]){
        $data->success = true;
    } else {
        $data->success = false;
    }

    echo json_encode($data);
    curl_close ($ch);
}


尝试使用此库检查生成的JSON语法

更新

它可以正确地检测
index.php
中的额外HTML以及其他可能的问题

下面的例子

use Seld\JsonLint\JsonParser;
$parser = new JsonParser();
$exception = $parser->lint('<html>{"user":"user","pass":"password","success":true}');
echo $exception->getMessage();
使用Seld\JsonLint\JsonParser;
$parser=新的JsonParser();
$exception=$parser->lint('{“user”:“user”,“pass”:“password”,“success”:true}');
echo$exception->getMessage();
将输出:

Parse error on line 1:
<html>{"user":"user"
^
Expected one of: 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['
第1行的分析错误: {“用户”:“用户” ^ 应为“字符串”、“数字”、“空”、“真”、“假”、“{”、“[”中的一个”
似乎没有任何理由定义该类。他可以使用一个简单的关联数组。它们都生成相同的JSON。更改了您所说的所有内容。感谢您的帮助。不幸的是,解码时仍然为空。他的问题是
JSON\u decode()
,而不是
JSON\u encode()
。为什么您认为更改正在编码的对象会有所不同?@Barmar它是在我尝试不同方法时创建的,我没有真正的原因就离开了它。感谢您的帮助。不幸的是仍然返回NULL。您应该查看
var\u dump()的输出
使用
查看源代码
,以防有其他HTML元素。编辑:在测试中使用不同的登录信息,编辑代码,var_dump($contents)显示相同。查看源代码时,您仍然可以看到所有HTML?我完全从页面中删除了所有HTML。之后,我可以让它正常工作。如果您不让我注意HTML在卷曲中的返回,我将永远不会得到它。非常感谢。我从未使用过PHP,因此尝试解决这一问题是一项艰巨的任务。
Parse error on line 1:
<html>{"user":"user"
^
Expected one of: 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['