【问题标题】:How to get properly formatted JSON array from SQL query that uses FOR JSON PATH?如何从使用 FOR JSON PATH 的 SQL 查询中获取格式正确的 JSON 数组?
【发布时间】:2019-05-26 08:47:34
【问题描述】:

我正在使用带有 FOR JSON PATH 的 sql 查询,它应该会给出 JSON 结果。但是,我不确定如何在 PHP 中返回结果。该命令可以完美地作为 SQL 命令运行,但是在将其作为准备好的语句执行时会遇到一些问题。

这是我的查询...

$getUsersTeams = $this->dbConn->prepare("SELECT T.Id AS Id, T.TeamName AS TeamName, T.TeamImage AS Image, T.Description AS Description, T.IsActive AS IsActive, TU.IsAdmin AS IsAdmin,
                                                    ( SELECT TU.UserId AS id, U.FirstName, U.LastName, U.DisplayPicture
                                                    FROM TeamUsers TU
                                                    INNER JOIN Users U ON TU.UserId = U.Id
                                                    WHERE TU.TeamId = T.Id
                                                    FOR JSON PATH
                                                    ) AS [Members]
                                                    FROM TeamUsers TU
                                                    INNER JOIN Teams T ON T.Id = TU.TeamId
                                                    WHERE UserId = :userId
                                                    FOR JSON PATH, INCLUDE_NULL_VALUES, ROOT('Teams')");
            $getUsersTeams->bindParam(':userId', $this->userId);

            if(!$getUsersTeams->execute())
            {
                return false;
            }

            $usersTeamsResult = $getUsersTeams->fetch(PDO::FETCH_ASSOC);
        header("content-type: application/json");
        echo $usersTeamsResult;
            exit;

我尝试过 fetch、fetchall 和 while 循环来获取数据。

在我尝试过的所有 3 种方法中,它总是回显“Array”。尽管, 如果我用 fetchAll...

echo json_encode($usersTeamsResult);

...那么结果至少会回显,但格式不正确,就像这样...

"JSON_F52E2B61-18A1-11d1-B105-00805F49916B": "{\"Teams\":[{\"Id
\":1,\"TeamName\":\"GroupName1\",\"Image\":null,\"Description\":null,
\"IsActive\":true,\"IsAdmin\":false,\"Members\": .....ETC   "}]}]}"

我没有包含整个回复,但这就是它的要点。 我已经尝试使用 stripslashes 来删除斜线,但这不起作用。

我只想得到响应并按原样回应。有谁知道我怎么能做到这一点?谢谢!

【问题讨论】:

  • 尝试删除这一行header("content-type: application/json");并保留这一行$array = son_encode($usersTeamsResult);
  • 当字符串在 json 中进行双重编码时,这很常见。确保只编码一次
  • 我试过 $usersTeamsResult = $getUsersTeams->fetch(PDO::FETCH_ASSOC); echo json_encode($userTeamsResult);出口;但我只是得到空值,也尝试使用 fetchAll...
  • 您是否尝试过一次解码 json 以查看您是否再次获得了有效的 json 字符串?不要 json_encode($userTeamsResult),$userTeamsResult 已经编码了
  • 是的,我试过了,它给了我 null,返回任何数据的唯一方法是使用 fetchAll、json_encode 和标头 application/json

标签: php json tsql pdo


【解决方案1】:

我通过这样做让它工作了,不知道为什么我必须经历这一切才能让它工作,但是是的......

$usersTeamsResult = $getUsersTeams->fetchAll(PDO::FETCH_ASSOC);
            $myArray = $usersTeamsResult[0];
            $usersTeams = json_decode(array_shift($myArray), true);

然后 $usersTeams 是格式正确的关联数组,然后我可以使用 json_encode 对其进行编码。

【讨论】:

    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2021-04-24
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多