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
Возникает вопрос: каковы преимущества его возврата в виде массива, а не объекта?
Foxinni
52
Это поднимает вопрос. «Задать вопрос» означает принять то, что еще предстоит доказать ( см. ). В любом случае преимущество может заключаться в том, что OP более удобен для обхода массивов, чем объекты, или что некоторый другой, уже реализованный код, требует массива.
jamesnotjim
8
@jamesnotjim Реализация по умолчанию, которая возвращает объект, может вызвать вопрос, что объекты лучше возвращают значения, чем массивы, не так ли?
Дэвид Манн
7
Действительно, это может @DavidMann. Туше!
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);
diEcho
источник
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, производительность может ухудшиться.

neokio
источник
6

Согласно PHP Documentation 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));
?>
coreyavis
источник
6
Это пустая трата процессора / памяти, как это было предложено делает то же самое, внутренне гораздо быстрее. json_decode($object, true);true
TCB13 12.12.13
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; 

}

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

TechyFlick
источник
2

в PHP json_decode конвертирует данные json в связанный с PHP массив.
Например:$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
}
lalithkumar
источник