2010-08-14 18 views
5

estoy trabajando con JSON por PHP en este momento, cuando codificarlo, sería salida como:estructurado JSON diseño

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

Cuando me gustaría que a la salida de la siguiente manera:

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

Para que yo y mis otros desarrolladores lo puedan leer lo suficientemente bien cuando estén estructurados. ¿Cómo puedo hacer esto?

ejemplo también de esta manera:

https://graph.facebook.com/19292868552

Saludos

+7

Recomiendo usar mejores herramientas para ver los datos en lugar de tratar de formatearlo para su salida. https://addons.mozilla.org/en-US/firefox/addon/10869/ – Quentin

+1

De acuerdo con @David. Firebug te permite navegar JSON como un árbol, también. Muy útil. –

+0

¿Está tratando de codificar JSON ya bien formado con json_encode() antes de decodificarlo, ya que eso produciría el resultado anterior? - ver mi edición a continuación. –

Respuesta

5

Podría resultar útil a mí mismo, así que aquí tiene una función poco escribí:

<?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; 
} 
?> 

¡Es ingenuo, confiando en que PHP devolverá un vali d cadena JSON. Podría escribirse de manera más concisa, pero es fácil modificarlo de esta manera. (Y, por supuesto, esto agrega una sobrecarga innecesaria en escenarios de producción donde solo una máquina lee el texto.)

Editar: Se agregó una cláusula else para captar números y otros caracteres desconocidos.

+2

Si crees que es ingenuo confiar en que PHP producirá JSON cuando se usa la función incorporada de JSON ... ¿cómo puedes confiar en PHP lo suficiente para usarlo? – Quentin

+0

@David, solo lo mencioné como una advertencia para no extraer ese código para el análisis arbitrario de JSON, ya que espera el formato que PHP suministra. @Peter, este es un codificador. Necesitas pasarle un objeto para convertirlo a JSON. – Matthew

+0

@Konforce - Disculpa, congelación de cerebro. Estaba pensando en json_decode. –

3

A partir de PHP 5.4.0 alfa1, puede fácilmente hacerlo como:

$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"; 

la salida es:

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

Esta es probablemente la manera más fácil:

var_dump(json_decode($json)); 
Cuestiones relacionadas