2010-08-14 66 views
5

我與JSON工作由PHP的那一刻,當我進行編碼,這將輸出:結構化JSON佈局

{"username":"ND","email":"[email protected]","regdate":"8th June 2010","other":{"alternative":"ND"},"level":"6"} 

當我將它想輸出是這樣的:

{ 
    "username": "ND", 
    "email": "[email protected]", 
    "regdate": "8th June 2010", 
    "other": 
    { 
     "alternative": "ND" 
    }, 
    "level":"6" 
} 

這樣,我和其他開發人員就可以在結構化的情況下閱讀它。我怎樣才能做到這一點?

例也是這樣:

https://graph.facebook.com/19292868552

乾杯

+7

我建議使用更好的工具來查看數據,而不是嘗試格式化輸出。 https://addons.mozilla.org/en-US/firefox/addon/10869/ – Quentin 2010-08-14 21:44:51

+1

同意@David。 Firebug還允許您將JSON導航爲樹狀結構。很有用。 – 2010-08-14 21:48:46

+0

在解碼之前,您是否試圖使用json_encode()對已經格式良好的JSON進行編碼,因爲這會產生上述結果? - 看到我的編輯如下。 – 2010-08-14 23:21:36

回答

5

我能找到這個有用的自己,所以這裏有一個小功能,我寫道:

<?php 
function json_pretty_encode($obj) 
{ 
$json = json_encode($obj); 
if (!$json) return $json; 

$f = ''; 
$len = strlen($json); 

$depth = 0; 
$newline = false; 

for ($i = 0; $i < $len; ++$i) 
{ 
    if ($newline) 
    { 
    $f .= "\n"; 
    $f .= str_repeat(' ', $depth); 
    $newline = false; 
    } 

    $c = $json[$i]; 
    if ($c == '{' || $c == '[') 
    { 
    $f .= $c; 
    $depth++; 
    $newline = true; 
    } 
    else if ($c == '}' || $c == ']') 
    { 
    $depth--; 
    $f .= "\n"; 
    $f .= str_repeat(' ', $depth); 
    $f .= $c; 
    } 
    else if ($c == '"') 
    { 
    $s = $i; 
    do { 
    $c = $json[++$i]; 
    if ($c == '\\') 
    { 
    $i += 2; 
    $c = $json[$i]; 
    } 
    } while ($c != '"'); 
    $f .= substr($json, $s, $i-$s+1); 
    } 
    else if ($c == ':') 
    { 
    $f .= ': '; 
    } 
    else if ($c == ',') 
    { 
    $f .= ','; 
    $newline = true; 
    } 
    else 
    { 
    $f .= $c; 
    } 
} 

return $f; 
} 
?> 

這是天真,相信PHP會返回一個vali d JSON字符串。它可以寫得更簡潔,但很容易以這種方式修改。 (當然這會增加生產場景中不必要的開銷,因爲只有一臺機器讀取文本。)

編輯:添加了else子句來捕獲數字和其他未知字符。

+2

如果您認爲在使用內置的JSON函數時PHP會產生JSON是一種天真的做法......您如何信任PHP足以使用它? – Quentin 2010-08-14 22:18:20

+0

@David,我只是將它作爲一個警告,不要將該代碼拉出來進行任意的JSON解析,因爲它預計PHP提供的格式。 @Peter,這是一個編碼器。你需要傳遞一個對象來轉換成JSON。 – Matthew 2010-08-14 22:27:12

+0

@Konforce - 對不起,大腦凍結。我只是想着json_decode。 – 2010-08-14 22:31:56

3

由於PHP 5.4.0 ALPHA1的,你可以很容易地做到這一點,如:

$data = array (
    'username' => 'ND', 
    'email' => '[email protected]', 
    'regdate' => '8th June 2010', 
    'other' => 
    array (
    'alternative' => 'ND', 
), 
    'level' => '6', 
); 

echo json_encode($data, JSON_PRETTY_PRINT),"\n"; 

輸出是:

{ 
    "username": "ND", 
    "email": "[email protected]", 
    "regdate": "8th June 2010", 
    "other": { 
     "alternative": "ND" 
    }, 
    "level": "6" 
} 
-2

這可能是最簡單的方法:

var_dump(json_decode($json));