json_decode到数组


422

我正在尝试将JSON字符串解码为数组,但出现以下错误。

致命错误:不能在第6行的C:\ wamp \ www \ temp \ asklaila.php中将stdClass类型的对象用作数组

这是代码:

<?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 '18

Answers:


839

根据文档,您需要指定是否要使用关联数组而不是中的对象json_decode,这是代码:

json_decode($jsondata, true);

4
这就引出了一个问题,将其作为数组而不是对象返回的好处是什么?
Foxinni 2012年

52
它提出了一个问题。“提出一个问题”意味着假设有待证明的东西(参考文献)。在任何一种情况下,其优点可能是OP比对象更方便地遍历数组,或者某些其他已经实现的代码需要数组。
jamesnotjim 2013年

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);

27

这是一个迟到的贡献,但对于投出有效的情况下json_decode(array)
考虑以下:

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

如果$jsondata以空字符串形式返回(按照我的经验,通常json_decode会返回),则将返回NULL,从而导致错误警告:第3行为foreach()提供了无效的参数。您可以添加一行if / then代码或三元运算符,但是IMO只需将第2行更改为...

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

...除非您一次要json_decode处理数百万个大型阵列,否则@ TCB13指出,在这种情况下,性能可能会受到负面影响。



6

根据PHP Documentation json_decode函数,有一个名为assoc的参数,它将返回的对象转换为关联数组

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

由于assoc参数是FALSE默认设置,因此您必须将此值设置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那样,这浪费了CPU /内存,而内部却要快得多。
TCB13 2013年

1
@ TCB13,除非同时需要并且不想再次运行解码
Jimmy Kane

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 

因此,如果要使用数组,则可以在json_decode函数中将第二个参数传递为“ true” 。


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);

在PHP中循环遍历JSON数组

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

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

}

结果:计算机系统(网络)



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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.