json_decode для масиву


422

Я намагаюся розшифрувати рядок JSON в масив, але я отримую наступну помилку.

Фатальна помилка: не можна використовувати об’єкт типу stdClass як масив у C: \ wamp \ www \ temp \ asklaila.php у рядку 6

Ось код:

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj['Result']);
?>

1
Це спрацювало б, якщо ви зверталися до $ob->Resultнього.
lapin

Відповіді:


839

Відповідно до документації , вам потрібно вказати, чи потрібно асоціативний масив замість об'єкта від json_decode, це буде код:

json_decode($jsondata, true);

4
Це задає питання, які переваги мати повернення як масив, а не об'єкт?
Фоксинні

52
Це викликає питання. "Попросити питання" означає припустити щось, що залишається довести ( посилання ). У будь-якому випадку перевагою може бути те, що ОП зручніше пересувати масиви, ніж об’єкти, або що якийсь інший, вже реалізований код вимагає масиву.
jamesnotjim

8
@jamesnotjim Реалізація за замовчуванням, яка повертає об'єкт, може задати питання, що об'єкти краще повертають значення, ніж масиви, чи не так?
Девід Манн

7
Дійсно, це могло @DavidMann. Touché!
jamesnotjim

8
Я б додав коментар (хоча і через роки), що немає можливості, щоб JSON містив що-небудь, крім даних, що робило це заплутаним вибором "за замовчуванням".
Баррі

45

спробуйте це

$json_string = 'http://www.domain.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata,true);
echo "<pre>";
print_r($obj);

27

Це пізній внесок, але є дійсний випадок для лиття json_decodeз (array).
Розглянемо наступне:

$jsondata = '';
$arr = json_decode($jsondata, true);
foreach ($arr as $k=>$v){
    echo $v; // etc.
}

Якщо $jsondataколи-небудь повертається як порожній рядок (як це моє враження часто), json_decodeповернеться NULL, що призведе до помилки Попередження: Неправильний аргумент, наданий для foreach () у рядку 3 . Ви можете додати рядок if / then коду чи потрійного оператора, але IMO чистіше просто змінити рядок 2 на ...

$arr = (array) json_decode($jsondata,true);

... якщо тільки ви не отримаєте json_decodeмільйони великих масивів одразу, у цьому випадку, як вказує @ TCB13, на продуктивність може бути негативно.



6

Відповідно до функції документації PHP json_decode є параметр з назвою assoc, який перетворює повернені об'єкти в асоціативні масиви

 mixed json_decode ( string $json [, bool $assoc = FALSE ] )

Оскільки параметр assocFALSE за замовчуванням, ви повинні встановити це значення TRUE, щоб отримати масив.

Вивчіть код нижче для прикладу наслідків:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));

який виводить:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

5

Це також змінить його у масив:

<?php
    print_r((array) json_decode($object));
?>

6
Це марна трата процесора / пам'яті, як це було запропоновано робить те ж саме, внутрішньо набагато швидше. json_decode($object, true);true
TCB13

1
@ TCB13, за винятком випадків, коли вам потрібно обоє і не хочете запускати декодування знову
Джиммі Кейн

3
Погоджуйтеся з @JimmyKane. Я спробував запустити обидві версії циклу; якщо вам потрібні і об'єкт, і масив (хоча це повинно траплятися рідко?), json_decode+ кастинг на 45% швидше, ніж виконання обох ароматів json_decode. З іншого боку, обидва настільки швидкі, що, якщо вам не знадобляться буквально тисячі розшифровок, різниця незначна.
LSerni

4

json_decodeпідтримка другого аргументу, коли він встановлений для TRUEнього, поверне Arrayзамість stdClass Object. Перегляньте сторінку функції вручну,json_decode щоб побачити всі підтримувані аргументи та її деталі.

Наприклад, спробуйте це:

$json_string = 'http://www.example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, TRUE); // Set second argument as TRUE
print_r($obj['Result']); // Now this will works!

3
json_decode($data, true); // Returns data in array format 

json_decode($data); // Returns collections 

Отже, якщо ви хочете масив, ви можете передати другий аргумент як "true" у json_decodeфункції.


3

Я сподіваюся, що це вам допоможе

$json_ps = '{"courseList":[  
            {"course":"1", "course_data1":"Computer Systems(Networks)"},  
            {"course":"2", "course_data2":"Audio and Music Technology"},  
            {"course":"3", "course_data3":"MBA Digital Marketing"}  
        ]}';

Використовуйте функцію декодування Json

$json_pss = json_decode($json_ps, true);

Перекидання масиву JSON у php

foreach($json_pss['courseList'] as $pss_json)
{

    echo '<br>' .$course_data1 = $pss_json['course_data1']; exit; 

}

Результат : Комп'ютерні системи (мережі)


2

у PHP json_decode перетворити дані json в масив, пов’язаний з PHP
для Ex:$php-array= json_decode($json-data, true); print_r($php-array);


2

Спробуйте це

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, true);
echo "<pre>"; print_r($obj['Result']);
?>

2

Спробуйте так:

$json_string = 'https://example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj->Result);
foreach($obj->Result as $value){
  echo $value->id; //change accordingly
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.