Проблема с json_encode () - PullRequest
       12

Проблема с json_encode ()

8 голосов
/ 04 октября 2009

у меня есть простой массив:

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

когда я кодирую массив с помощью json_encode (), я получаю следующее:

["Kum","Kumpel"] 

У меня вопрос, что является причиной получения ["Kum","Kumpel"] вместо { "0" : "Kum", "1" : "Kumpel" }?

Ответы [ 5 ]

22 голосов
/ 04 октября 2009

В скобках «{}» указан объект, а «[]» используются для массивов в соответствии со спецификацией JSON. Массивы не имеют перечисления, если вы посмотрите на это с точки зрения распределения памяти. Это просто данные, за которыми следует больше данных, объекты с другой стороны имеют свойства с именами, и данные присваиваются свойствам, поэтому для кодирования такого объекта необходимо также передать правильные имена свойств. Но для массива вам не нужно указывать индексы, потому что они всегда будут 0..n, где n - длина массива - 1, единственное, что имеет значение, это порядок данных.

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

Причина, по которой JSON_FORCE_OBJECT заставляет его использовать «0,1,2», заключается в том, что для назначения данных объекту необходимо назначить их свойству, поскольку разработчик не предоставляет имен свойств (только данные), кодировщик использует массив индексы как имена свойств, потому что это единственные имена, которые имеют смысл.

Примечание: согласно Руководству по PHP параметры доступны только в PHP 5.3.

Для более старых версий PHP см. Ответ Челмерца о том, как заставить json_encode использовать индексы.

7 голосов
/ 04 октября 2009

Как сказал Гамбо, на стороне JS это не будет иметь значения. Чтобы заставить PHP в это, попробуйте это:

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

Не очень удобно, я бы придерживался обозначения массива.

2 голосов
/ 15 июля 2012

Просто приведите как объект, и он будет работать нормально ... параметр JSON_FORCE_OBJECT делает то же самое.

json_encode((object)$array);

Не забудьте преобразовать его обратно в массив php, чтобы вы могли получить доступ к его значениям в php:

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

json_encode($array);
0 голосов
/ 16 мая 2016

Лично я считаю, что это ошибка, которую нужно исправить в PHP. JSON_FORCE_OBJECT - абсолютно не ответ. Если вы пытаетесь заняться каким-либо типичным программированием, вас постоянно обманывают. Например, следующий действительный PHP:

массив ("0" => массив (0,1,2,3), "1" => массив (4,5,6,7));

И должны быть преобразованы в

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

Тем не менее, PHP ожидает, что я либо приму

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

или

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

Ничего из этого не верно. Как я могу расшифровать такой объект? Какова возможная причина, чтобы когда-либо изменить что-то, что явно использует строки в качестве индексов? Как будто PHP пытался быть умным, чтобы помочь идиотам, которые не могут отличить строки от целочисленных, но в процессе запутал любого, кто законно использовал строки в качестве индексов, независимо от того, во что значение МОЖЕТ быть превращено.

0 голосов
/ 04 октября 2009

Поскольку у вас есть массив PHP с только числовыми ключами, нет необходимости использовать объект JavaScript. Но если вам это нужно, попробуйте предложение Майку Мори.

...