从具有JSON内容类型的PHP文件中检索JSON

时间:2013-02-19 08:35:54

标签: php json

这可能看起来像一个愚蠢的问题,但经过长时间的搜索,我很难过。

我正在使用查询来检索数据,然后编码为JSON,以便在我的网站周围的各个地方使用。只有一个问题。我似乎无法检索数据!

Query(data.users.php):

$arr = array();

$rs = mysql_query("SELECT
    CONCAT(m.firstName,' ',m.lastName) AS name,
    m.email,
    m.permission,
    m.costRate,
    m.dt,
    m.memberID,
    m.moduleFinancial,
    o.orgName

    FROM members m

    LEFT JOIN organisations o ON m.organisationID = o.organisationID
    WHERE status = 'true'
    ORDER BY name"
) or die(mysql_error());

while($obj = mysql_fetch_object($rs)) {
$arr[] = $obj;
}
header("Content-type: application/json");

    echo json_encode($arr);

数据示例:

[{"name":"Admin User","email":"test@test.com","permission":"admin","dt":"2013-02-02 10:26:29","memberID":"M0000001"},{"name":"Another User","email":"another@test.com","permission":"admin","dt":"2012-02-02 10:26:29","memberID":"M0000002"}]

有什么想法吗?

更新了提取代码:

ob_start();
            include("../data/data.users.php");
            $arr = json_decode(ob_get_clean(), true);

            foreach($arr as $item) {
                if ($item['memberID'] == $_GET["ID"]) {
                    $user_name = $item['name'];
                }
            }

4 个答案:

答案 0 :(得分:2)

PHP> = 5.4具有JSON_PRETTY_PRINT选项,如下所示:http://php.net/manual/en/function.json-encode.php以获得格式良好的JSON字符串:

json_encode($arr, JSON_PRETTY_PRINT);

答案 1 :(得分:1)

我相信,你的问题出在其他地方,json_decode不需要换行符。但是,我发现这条线可疑:

json_decode(file_get_contents("../data/data.users.php"),true);

您想将PHP脚本作为JSON读取吗?这是源代码,没有任何内容在那里执行!

<强>更新

这与我怀疑的完全一样:您阅读PHP文件并将其传递给json_decode。 PHP源代码无效JSON,因此返回nullfile_get_contents只能通过http包装器实现:

file_get_contents("http://example.com/data/data.users.php")

但这是不必要的复杂,通常不是一个好主意。此外,该脚本必须位于公共Web目录下。您应该包含 data.users.php。为此,您有两种选择:

  1. echo更改为return,然后使用:

    $arr = json_decode(include("../data/data.users.php"), true);
    
  2. 使用输出缓冲:

    ob_start();
    include("../data/data.users.php");
    $arr = json_decode(ob_get_clean(), true);
    
  3. 第一个选项应该是首选选项,但是,如果由于某种原因无法更改data.users.php,则第二个选项是有效的解决方法。

    P.S。:如果header()不会直接通过网络调用,您可能也希望摆脱对data.users.php的调用。否则,请记住在第二个脚本中覆盖内容类型标头,如果它没有向浏览器/客户端提供JSON。

答案 2 :(得分:1)

亲爱的......

输入

{"key1":[1,2,3],"key2":"value"}

输出

    {
    "key1": [
        1,
        2,
        3
    ],
    "key2": "value"
}

功能代码:

    function prettyPrint( $json )
{
    $result = '';
    $level = 0;
    $prev_char = '';
    $in_quotes = false;
    $ends_line_level = NULL;
    $json_length = strlen( $json );

    for( $i = 0; $i < $json_length; $i++ ) {
        $char = $json[$i];
        $new_line_level = NULL;
        $post = "";
        if( $ends_line_level !== NULL ) {
            $new_line_level = $ends_line_level;
            $ends_line_level = NULL;
        }
        if( $char === '"' && $prev_char != '\\' ) {
            $in_quotes = !$in_quotes;
        } else if( ! $in_quotes ) {
            switch( $char ) {
                case '}': case ']':
                    $level--;
                    $ends_line_level = NULL;
                    $new_line_level = $level;
                    break;

                case '{': case '[':
                    $level++;
                case ',':
                    $ends_line_level = $level;
                    break;

                case ':':
                    $post = " ";
                    break;

                case " ": case "\t": case "\n": case "\r":
                    $char = "";
                    $ends_line_level = $new_line_level;
                    $new_line_level = NULL;
                    break;
            }
        }
        if( $new_line_level !== NULL ) {
            $result .= "\n".str_repeat( "\t", $new_line_level );
        }
        $result .= $char.$post;
        $prev_char = $char;
    }

    return $result;
}

这对你有帮助........

答案 3 :(得分:0)

echo json_encode($arr)."\r\n";