2016-07-27 2 views
0

Я только что создала небольшую программу для проверки JSON и JSON_FORCE_OBJECTПутаница с json_decode второй парами

$tree = [ 
    0 => array 
    (
     'id' => 1, 
     'parent' => '0', 
     'name' => 'b', 
     'surname' => 'myfolder/b' 
    ), 

    1 => array 
    (
     'id' => 2, 
     'parent' => 1, 
     'name' => 'ignore', 
     'surname' => 'myfolder/ignore2' 
    ), 

    2 => array 
    (
     'id' => 3, 
     'parent' => 1, 
     'name' => 'ignore2', 
     'surname' => 'myfolder/ignore4' 
    ) 

]; 
var_dump($tree); 
$try = json_encode($tree);//To print with key. Also if we decode we get result as object 
//echo $try; 
echo '<br />'; 
$try2 = json_decode($try,JSON_FORCE_OBJECT); 
var_dump($try2); 

$ try2 в точности равен $ дерева ассоциативного массива. Принимая во внимание, если я удалю JSON_FORCE_OBJECT от этой линии

$try2 = json_decode($try,JSON_FORCE_OBJECT); 

Я получаю массив с дочерним объектом. Хотя JSON_FORCE_OBJECT предполагается использовать с json_encode, но используя его с json_decode, я получаю удивительный результат. Я не могу понять, что происходит внутри? Я подумал, что когда я его кодирую и расшифрую, я должен получить тот же результат. Но я получил тот же результат только тогда, когда использовал JSON_FORCE_OBJECT. Кто-нибудь может помочь, почему это происходит?

+1

Согласно инструкции, [ 'json_encode()'] (http://php.net/manual/en/function.json-encode.php) принимает ' JSON_FORCE_OBJECT', а ['json_decode()'] (http://php.net/manual/en/function.json-decode.php) - нет. – MonkeyZeus

+0

'json_decode' не имеет флагов опций. Второй параметр является логическим. 'JSON_FORCE_OBJECT' является только опцией для' json_encode'' –

+0

@nik. Я не понял вашу точку зрения. JSON_FORCE_OBJECT не является логическим. Как он может принять этот параметр? –

ответ

1

Согласно инструкции: http://php.net/manual/en/function.json-decode.php

json_decode возвращает массив objects, если вы хотите, чтобы преобразовать их в assoc array вы должны указать второй из параметров, который является boolean

JSON_FORCE_OBJECT является int со значением 16. .. , когда это передается как второй параметр php лить/конвертирует его в его эквивалент bool, который true.

Чтобы проверить вышеизложенное поведение попробовать:

var_dump((bool)1; (bool)2, (bool)16) 
//output bool(true) bool(true) bool(true) . 
var_dump((bool)0) 
//outputs bool(false) 

Так это не имеет ничего общего с JSON_FORCE_OBJECT ... даже

json_decode($try,true); 
json_decode($try,2); 
json_decode($try,3); 
json_decode($try,4); 
json_decode($try,'someVar'); 
.... 
//should return your expected result (assoc array) 

Точно так же, если вы передаете 0 в качестве второго парам PHP обрушит его в bool (который является false) и возвращает вас object

json_decode($try,0); 
json_decode($try,false); 
json_decode($try,null) 
json_decode($try) 
... 
//will return objects 
+0

Большое спасибо за подробное объяснение. Теперь моя путаница очищается. –

+0

np! Счастливое кодирование –

1

Второй параметр, равный json_decode, является булевым. Он принимает true или false. Он не принимает JSON_FORCE_OBJECT. Вы пытаетесь использовать неверную константу для неправильной функции.

json_decodeчетвёртые параметры «S принимает битовую маску констант, но в настоящее время он поддерживает только JSON_BIGINT_AS_STRING.

Если вы хотите вернуть stdClass экземпляры объектов JSON из json_decode, установите его второй параметр на false (по умолчанию). Установка его на любое значение без ложности заставляет его возвращать ассоциативные массивы вместо объектов. Установка его на JSON_FORCE_OBJECT считается «not-falsey».

Это все описано в руководстве: http://php.net/json_decode

+0

Большое спасибо. Теперь я понял, где я ошибся. –

Смежные вопросы