Pergunta

Eu tenho uma matriz simples:

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

quando eu codificar a matriz usando json_encode (), recebo seguinte:

["Kum","Kumpel"] 

A minha pergunta é, qual é a razão para obter ["Kum","Kumpel"] vez de { "0" : "Kum", "1" : "Kumpel" }?

Foi útil?

Solução

"{}" suportes especificar um objecto e "[]" são usados ??para as matrizes de acordo com a especificação JSON. Arrays não têm enumeração, se você olhar para ele do ponto de vista de alocação de memória. É dados apenas seguido por mais dados, objetos de outro lado têm propriedades com nomes e os dados são atribuídos às propriedades, portanto, a codificar tal objeto que você também deve passar os nomes de propriedade corretos. Mas para matriz que você não precisa especificar os índices, porque eles sempre será 0..n, onde n é o comprimento da matriz - 1, a única coisa que importa é a ordem dos dados.

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

A razão pela qual JSON_FORCE_OBJECT Foces-lo para usar "0,1,2" é porque a dados atribuir a obeject tem de lhe atribuir a uma propriedade, uma vez que há nomes de propriedades são dadas pelo desenvolvedor (apenas os dados) o codificador utiliza variedade índices como nomes de propriedade, porque esses são os únicos nomes que faria sentido.

Nota: de acordo com a PHP manual de parâmetros opções só estão disponíveis a partir de PHP 5.3

Para versões mais antigas do PHP referem-se a resposta de chelmertz para uma maneira de fazer json_encode a índices de uso.

Outras dicas

Como Gumbo disse, no lado do JS a ele não importa. Para forçar PHP nele, tente o seguinte:

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

Não que utilizável, eu ia ficar com a notação de matriz.

Apenas escalado como um objeto e ele vai funcionar bem ... o parâmetro JSON_FORCE_OBJECT faz exatamente a mesma coisa.

json_encode((object)$array);

Não se esqueça de convertê-lo em uma matriz de php para que você possa acessar seus valores em PHP:

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

json_encode($array);

Uma vez que você está tendo uma matriz PHP com as chaves apenas numéricos, não há necessidade de usar um objeto JavaScript. Mas se você precisar de um, tente a sugestão de Maiku Mori.

Eu acho, pessoalmente, esse é um problema que precisa ser corrigido no PHP. JSON_FORCE_OBJECT não é absolutamente uma resposta. Se você tentar fazer qualquer tipo de programação genérica você tropeçar constantemente. Por exemplo, o seguinte é PHP válido:

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

E deve ser convertido para

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

No entanto, PHP espera-me a aceitar qualquer

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

ou

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

Nem de que está certo em tudo. Como posso possivelmente decodificar um objeto como esse? Que razão há para mudar alguma coisa sempre que está usando claramente cordas como índices? É como PHP estava tentando ser inteligente para ajudar as pessoas idiotas que não podem cordas diferenciar de ints, mas no processo confuso alguém legitimamente usando cordas como índices, independentemente do que o valor poderia ser transformado em.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top