2013-03-08 12 views
8

Sto riscontrando un problema nell'utilizzo di json_encode per generare una stringa json codificata da una matrice.Problema json_encode PHP con il tasto dell'array 0

La sezione della matrice in questione si presenta così

RatingDistribution (Array, 11 elements) 
    0 (Array, 1 element) 
     0 (String, 3 characters) 4.5 
    1 (Array, 1 element) 
     1 (String, 4 characters) 11.9 
    2 (Array, 1 element) 

Ma produce questo nella stringa:

"RatingDistribution":[["4.5"],{"1":"11.9"}, 

mi aspetterei questo:

"RatingDistribution":[{"0":"4.5"},{"1":"11.9"}, 

Tutto quello che ho' sto facendo è questo:

$result = json_encode($array); 

Ho fatto qualcosa di sbagliato o ho bisogno di più codice per garantire che il tasto 0 sia presente?

Acclamazioni Andy

+1

potete inserire il codice PHP in cui si ottiene la matrice? o print_r l'array? Sembra che la tua ricerca sia sbagliata. –

+0

Penso che avviti sul secondo elemento (indice 1) perché il sub array inizia come 1 e quindi viene interpretato come una chiave di stringa. – TFennis

risposta

-1

Cou può tentare di lanciare la chiave array in una stringa per esempio con strval o (stringa).

+1

Questo dovrebbe essere un commento! – sandip

+1

Questo è stato il mio primo pensiero ma non ha fatto alcuna differenza, racchiudendolo tra virgolette ma rende molto disordinato json :) –

14

Il risultato che si sta ottenendo dovrebbe essere previsto; json_encode rileva che si stanno utilizzando solo chiavi numeriche nell'array, quindi lo converte in una matrice anziché in un oggetto in JSON. Il più delle volte, è esattamente quello che vuoi fare.

Se per qualche ragione non lo fai (perché?), In PHP> = 5.3 è possibile utilizzare il flag JSON_FORCE_OBJECT per ottenere il risultato desiderato:

$result = json_encode($array, JSON_FORCE_OBJECT); 
+0

il comportamento è un po 'strano, ad esempio il primo valore verrà decodificato in un array in cui tutti i valori successivi saranno oggetti . –

+0

Sospetto che dovremo utilizzare JSON_FORCE_OBJECT –

+0

@ user2147830: IMHO non proprio strano. La prima chiave del secondo array non è '0', che è sufficiente per l'euristica per decidere" OK, questo è un array associativo ". – Jon

1

Se si desidera utilizzare le matrici in JSON quindi, invece del parametro JSON_FORCE_OBJECT, puoi semplicemente trasmettere l'array all'oggetto.

Problema:

json_encode([0 => [1,2,3]]); // Return: [[1,2,3]] 
json_encode(["0" => [1,2,3]]); // Return: [[1,2,3]] 
json_encode([1 => [1,2,3]]); // Return: {"1":[1,2,3]} 

Non quello che ci aspettiamo:

json_encode([0 => [1,2,3]], JSON_FORCE_OBJECT); // Return: {"0":{"0":1,"1":2,"2":3}} 

Soluzione:

json_encode((object)[0 => [1,2,3]]); // Return: {"0":[1,2,3]} 
json_encode(new \ArrayObject([0 => [1,2,3]])); // Return: {"0":[1,2,3]}