Декодировать редкий объект json в массив php - PullRequest
22 голосов
/ 20 марта 2010

Я могу создать разреженный массив php (или карту), используя команду:

$myarray = array(10=>'hi','test20'=>'howdy');

Я хочу сериализовать / десериализовать это как JSON. Я могу сериализовать его с помощью команды:

$json = json_encode($myarray);

, что приводит к строке {"10":"hi","test20":"howdy"}. Однако, когда я десериализую это и приведу к массиву с помощью команды:

$mynewarray = (array)json_decode($json);

Кажется, я потерял все сопоставления с ключами, которые не были действительными идентификаторами php. То есть mynewarray имеет отображение 'test20'=>'howdy', но не 10=>'hi' и '10'=>'hi'.

Есть ли способ сохранить числовые ключи в карте php при преобразовании в json и обратно, используя стандартные функции json_encode / json_decode?

(я использую PHP версии 5.2.10-2ubuntu6.4.)

Ответы [ 3 ]

47 голосов
/ 20 марта 2010

json_decode возвращает объект типа stdClass по умолчанию. Вы получаете доступ к членам как к свойствам (т. Е. $result->test20). 10 не является допустимым именем для свойства, поэтому вы его теряете.

Вместо приведения к массиву вы можете передать true в качестве второго аргумента json_decode, чтобы он сам возвращал ассоциативный массив:

$mynewarray = json_decode($json, true);

Если вы сделаете это, $mynewarray[10] будет работать нормально.

2 голосов
/ 21 марта 2010

Проблема заключается в преобразовании объекта в массив.

$a = (array)json_decode('{"10":"hi","test20":"howdy"}');
var_dump($a);

//outputs
array(2) {
  ["10"]=>
     string(2) "hi"
  ["test20"]=>
     string(5) "howdy"
}

Посмотрите, как этот массив имеет индекс "10"? Но в PHP все, что выглядит как число, преобразуется в число, особенно в индексах массива. Вы не можете просто получить a["10"], потому что он конвертирует "10" в число, и у этого массива нет такого индекса.

Однако foreach работает.

foreach ($a as $key => $value) {
   var_dump($key);
   var_dump($value);
}

//outputs
string(2) "10"
string(2) "hi"
string(6) "test20"
string(5) "howdy"

Вы также можете рассматривать результат json_decode как объект. Пока вы не сможете сделать $a->10 или $a->"10",

$a = json_decode('{"10":"hi","test20":"howdy"}');
$b = 10;
var_dump($a->$b);

//outputs
string(2) "hi"

работает.

Но, скорее всего, как сказал Крис, вы просто хотите передать true в качестве второго аргумента.

$a = json_decode('{"10":"hi","test20":"howdy"}', true);
var_dump($a[10]);

//outputs
string(2) "hi"
2 голосов
/ 20 марта 2010

Какая версия PHP? На 5.2 следующая программа / скрипт

$myarray = array(10=>'hi','test20'=>'howdy');
$json = json_encode($myarray);
$mynewarray = (array) json_decode($json);
var_dump($mynewarray);

Выходы

array(2) {
  ["10"]=>
  string(2) "hi"
  ["test20"]=>
  string(5) "howdy"
}

Который не отображает поведение, которое вы описываете.

Тем не менее, если ваша версия PHP неправильно передает JSON, попробуйте использовать get_object_vars для объекта stdClass, который json_decode возвращает

get_object_vars(json_decode($json))

Это может дать лучшие результаты.

...