При кодировании массива в json_encode, json_decode выводит объект

Я использую json_ecnode, а затем json_decode в PHP. по какой-то причине, хотя я кодирую массив с помощью json_encode, он всегда появляется как объект после декодирования json_decode.

Я не контролирую часть json_decode, так как какая-то другая система декодирует ее и использует. Я имею дело с частью кодирования. Что я могу сделать, чтобы сделать его декодировать как массив?

вот в примере кода:

$types = array(
'aa1' => array('type' => 'document/unknown', 'icon' => 'unknown'),
'aa2' => array('type' => 'video/quicktime', 'icon' => 'quicktime', 'groups' => array('video'), 'string' => 'video') 
);

var_dump($types);

$typesencoded = json_encode($types);
var_dump($typesencoded);

$typesdecoded = json_decode($typesencoded);
var_dump($typesdecoded);

и это вывод:

/tests/test.php:28:array (size=2)
  'aa1' => 
    array (size=2)
      'type' => string 'document/unknown' (length=16)
      'icon' => string 'unknown' (length=7)
  'aa2' => 
    array (size=4)
      'type' => string 'video/quicktime' (length=15)
      'icon' => string 'quicktime' (length=9)
      'groups' => 
        array (size=1)
          0 => string 'video' (length=5)
      'string' => string 'video' (length=5)

/tests/test.php:35:string '{"aa1":{"type":"document\/unknown","icon":"unknown"},"aa2":{"type":"video\/quicktime","icon":"quicktime","groups":["video"],"string":"video"}}' (length=142)

/tests/test.php:40:
object(stdClass)[78]
  public 'aa1' => 
    object(stdClass)[77]
      public 'type' => string 'document/unknown' (length=16)
      public 'icon' => string 'unknown' (length=7)
  public 'aa2' => 
    object(stdClass)[79]
      public 'type' => string 'video/quicktime' (length=15)
      public 'icon' => string 'quicktime' (length=9)
      public 'groups' => 
        array (size=1)
          0 => string 'video' (length=5)
      public 'string' => string 'video' (length=5)

3 ответа

При декодировании передайте второй аргумент как TRUE. Второй аргумент принимает логическое значение, то есть TRUE/FALSE, которое будет возвращать ассоциированный массив, если TRUE, и объект, если FALSE. + Изменить

$typesdecoded = json_decode($typesencoded);

в

$typesdecoded = json_decode($typesencoded,TRUE);

Ассоциативный массив * PHP можно кодировать только в объект JSON, но объект JSON можно декодировать либо в ассоциативный массив, либо в объект PHP. Вы контролируете, что вы предпочитаете со вторым параметром json_decode, Вы не можете контролировать результат на стороне кодирования, вам нужно контролировать его на стороне декодирования.

* (не непрерывно пронумерованный массив)

Альтернатива состоит в том, что сторона кодирования предоставляет что-то, что кодирует массив JSON ([...]), который может декодировать только в массив PHP.

Это то, что решило это для меня:

    $types = array(
     (object)array(
         'extension' => 'aa1',
         'icon' => 'unknown',
         'type' => 'document/unknown',
         'customdescription' => ''
     ),

    (object)array(
        'extension' => 'aa2',
        'icon' => 'quicktime',
        'type' => 'video/quicktime',
        'groups' => array('video'), 'string' => 'video'
    ),      
);

$typesencoded = json_encode($types);
Другие вопросы по тегам