Estoy tratando de aprender PHP y solo estoy tratando de generar algo de JSON
Este es el formato en el que lo quiero.
{ "Data": "Message was sent on 12-31-1999 12:00:00 am", "Sandbox": { "Sandboxed": true }, "Errors": [{ "Code": 5, "Message": "Message bounced back" }] }Y puedo hacer eso con:
$message = "Message was sent on 12-31-1999 12:00:00 am"; $errorMsg = "Message bounced back"; $sandboxkey = array( "Sandboxed" => true ); $error = array( "Code" => 5, "Message" => $errorMsg ); $package = array( "Data" => $message, "Sandbox" => $sandboxkey, "Errors" => $error ); return json_encode($package, JSON_FORCE_OBJECT | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);Pero solo quiero agregar la clave/valor "Sandbox" si se establece un valor booleano.
$isSandbox = true; $message = "Message was sent on 12-31-1999 12:00:00 am"; $errorMsg = "Message bounced back"; $error = array( "Code" => 5, "Message" => $errorMsg ); $package = array( "Data" => $message, "Errors" => $error ); if ($isSandbox) { $sandboxkey = array( "Sandboxed" => true ); array_push($package, $sandboxkey); } $error = array( "Code" => 5, "Message" => $errorMsg ); return json_encode($package, JSON_FORCE_OBJECT | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);Pero eso agrega un "0" y luego el KVP.
{ "Data": "Message was sent on 12-31-1999 12:00:00 am", "Errors": { "Code": 5, "Message": "Message bounced back" }, "0": { "Sandboxed": true } }Además, quiero que los errores se enumeren en una matriz como:
"Errors": [{ "Code": 5, "Message": "Message bounced back" }, { "Code": 4, "Message": "Message is old" } ]He probado múltiples combinaciones de inserción de matriz y JSON_FORCE_OBJECT, pero parece que no puedo obtenerlo exactamente como quiero. ¿Alguien puede ayudar?
Pero eso agrega un "0" y luego el KVP.
array_push() podría usarse si la matriz fuera una matriz numérica (es decir, las claves fueran números enteros, por ejemplo, 0 => 'cat', 1 => 'dog' . Pero en este caso, la matriz es una matriz asociativa . Una forma de establecer la clave deseada, Sandbox , es establecer la clave de matriz especificándola entre paréntesis:
if ($isSandbox) { $sandboxkey = array( "Sandboxed" => true ); $package['Sandbox'] = $sandboxkey; }Esto es necesario porque las otras claves de la matriz no son
Véalo demostrado en este ejemplo de patio de recreo.
De lo contrario, se podría usar array_merge() :
if ($isSandbox) { $sandboxArray = array( 'Sandbox' => array( "Sandboxed" => true ) ); $package = array_merge($package, $sandboxArray); }Vea una demostración en este ejemplo de patio de recreo.
Consulte esta respuesta para obtener más información sobre matrices numéricas y asociativas. Es un poco sorprendente que la diferencia no esté explicada explícitamente en la página de tipos de datos PHP Array .
Además, quiero que los errores se enumeren en una matriz...
Para esto, anide $error (una matriz asociativa, que se convertirá en un objeto JSON) en otra matriz.
$package = array( "Data" => $message, "Sandbox" => $sandboxkey, "Errors" => array($error) );Debe realizar algunos cambios en su código, lo que lo ayudará a lograr el resultado esperado.
1. Usa
array_mergeen lugar dearray_push2. Establezca la clave de
Errorscomo esta"Errors" => array($error)en lugar de"Errors" => $error
Pruebe este fragmento de código aquí
<?php ini_set('display_errors', 1); $isSandbox=true; $message = "Message was sent on 12-31-1999 12:00:00 am"; $errorMsg = "Message bounced back"; $error = array("Code" => 5, "Message" => $errorMsg); $package = array( "Data" => $message, "Errors" => array($error) ); if ($isSandbox) { $sandboxkey = array("Sandboxed" => true); $package=array_merge($package, $sandboxkey); } echo json_encode($package,JSON_PRETTY_PRINT);Producción:
{ "Data": "Message was sent on 12-31-1999 12:00:00 am", "Errors": [ { "Code": 5, "Message": "Message bounced back" } ], "Sandboxed": true }Cómo manejar json:
[] son matrices en json{} son objetos en json Entonces, para crear algo como {'data':[{'depperdata':2}]} haz
$a = new stdClass(); $a->data = array(); $b = new stdClass(); $b->deeperdata=2; $a->data[0]=$b; print_r(json_encode($a,JSON_PRETTY_PRINT));o
$a = array('data'=>array(array('depperdata'=>2))); print_r(json_encode($a,JSON_PRETTY_PRINT)); ¿Qué significa json_decode
0 ! (¡Evita eso!)Que tenga un lindo día...