Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

205
Views
Formatear JSON condicionalmente

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?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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) );
over 4 years ago · Santiago Trujillo Report

0

Debe realizar algunos cambios en su código, lo que lo ayudará a lograr el resultado esperado.

1. Usa array_merge en lugar de array_push

2. Establezca la clave de Errors como 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 }
over 4 years ago · Santiago Trujillo Report

0

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

  • si tiene una matriz asociada, se convierte en un json_object
  • si tiene una matriz indexada, se convierte en json_array
  • si tienes un objeto, se convierte en un json_object
  • si tiene una matriz mixta assoc/index, obtendrá json roto como su ejemplo. nombre de propiedad 0 ! (¡Evita eso!)

Que tenga un lindo día...

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!