2009-10-04 19 views
8

Tengo una simple matriz:Problema con json_encode()

array 
    0 => string 'Kum' (length=3) 
    1 => string 'Kumpel' (length=6) 

cuando codificar la matriz mediante json_encode(), consigo siguiente:

["Kum","Kumpel"] 

Mi pregunta es, ¿cuál es la razón para obtener ["Kum","Kumpel"] en lugar de { "0" : "Kum", "1" : "Kumpel" }?

Respuesta

22

"{}" corchetes especifican un objeto y "[]" se utilizan para matrices de acuerdo con la especificación JSON. Las matrices no tienen enumeración, si se mira desde la perspectiva de asignación de memoria. Solo se trata de datos seguidos de más datos, los objetos de otra mano tienen propiedades con nombres y los datos se asignan a las propiedades, por lo tanto, para codificar ese objeto también debe pasar los nombres de propiedad correctos. Pero para la matriz no necesita especificar los índices, porque siempre serán 0..n, donde n es la longitud de la matriz - 1, lo único que importa es el orden de los datos.

$array = array("a","b","c"); 
json_encode($array); // ["a","b","c"] 
json_encode($array, JSON_FORCE_OBJECT); // {"0":"a", "1":"b","2":"c"} 

La razón por la JSON_FORCE_OBJECT Foces que utilice "0,1,2" se debe asignar a los datos obeject debe asignar a una propiedad, ya que no hay nombres de propiedades se dan por el desarrollador (sólo los datos) el codificador utiliza índices de matriz como nombres de propiedad, porque esos son los únicos nombres que tendrían sentido.

Nota: de acuerdo con PHP manual los parámetros de opciones solo están disponibles desde PHP 5.3.

Para versiones anteriores de PHP, consulte la respuesta de chelmertz para obtener json_encode para usar índices.

+2

no exactamente, recibo esta advertencia: Advertencia: json_encode() espera exactamente 1 parámetro, 2 dado .. – cupakob

+0

Eso es extraño, es copiar y pegar del manual. –

+3

"5.3.0 El parámetro de opciones fue agregado." – VolkerK

0

Dado que tiene una matriz PHP con solo teclas numéricas, no es necesario utilizar un objeto JavaScript. Pero si necesitas uno, prueba la sugerencia de Maiku Mori.

7

Como dijo Gumbo, en el lado JS no importará. Para forzar PHP, intente esto:

$a = new stdClass(); 
$a->{0} = "Kum"; 
$a->{1} = "Kumpel"; 
echo json_encode($a); 

No es utilizable, me quedaría con la notación de matriz.

+2

IHMO: Este es el derecho forma en que necesita estar seguro de que un objeto anidado se serializará como {...} y otras matrices anidadas se serializarán como [...] – alexroat

2

Acaba de emitir como un objeto y funcionará bien ... el parámetro JSON_FORCE_OBJECT hace exactamente lo mismo.

json_encode((object)$array); 

No se olvide de convertir de nuevo en una matriz de php para que pueda acceder a sus valores en php:

$array = (object)$array; 
$array = (array)$array; 

json_encode($array); 
0

Yo personalmente creo que esto es un error que debe ser corregido en PHP. JSON_FORCE_OBJECT no es en absoluto una respuesta. Si intentas hacer algún tipo de programación genérica, te tropiezas constantemente.Por ejemplo, el siguiente es PHP válido:

matriz ("0" => matriz (0,1,2,3), "1" => matriz (4,5,6,7));

y se conviertan a

{ "0": [0,1,2,3], "1": [4,5,6,7]}

Sin embargo, PHP me espera ya sea a aceptar

[[0,1,2,3], [4,5,6,7]]

o

{ "0": { "0": 1," 1 ": 1," 2 ": 2," 3 ": 3}," 1 ": {" 0 ": 4," 1 ": 5," 2 ": 6," 3 ": 7}}

Ninguno de los cuales está bien. ¿Cómo puedo decodificar un objeto como ese? ¿Qué posible razón hay para cambiar alguna vez algo que claramente está usando cadenas como índices? Es como si PHP estuviera tratando de ser inteligente para ayudar a las personas idiotas que no pueden diferenciar las cadenas de los enteros, pero en el proceso arruinaron legítimamente el uso de cadenas como índices, sin importar en qué se pudiera convertir el valor.