배열에 대한 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

답변:


839

documentation에 따라 의 객체 대신 연관 배열을 원하는지 지정해야합니다 json_decode. 이것은 코드입니다.

json_decode($jsondata, true);

4
그것은 질문이 아니라, 객체가 아닌 배열로 반환하면 어떤 이점이 있습니까?
Foxinni

52
그것은 질문을 제기합니다. "질문을 구하다"는 것은 증명되어야 할 무언가를 가정하는 것을 의미합니다 ( ref ). 어느 경우이든, OP는 객체보다 배열을 순회하는 것이 더 편하거나 이미 구현 된 다른 코드에는 배열이 필요하다는 장점이 있습니다.
jamesnotjim

8
@jamesnotjim 객체를 반환하는 기본 구현은 객체가 배열보다 반환 값이 더 낫다는 질문을 할 수 있습니다.
David Mann

7
실제로 @DavidMann 할 수 있습니다. 터치!
jamesnotjim

8
나는 몇 년 후에도 JSON에 데이터를 포함 할 가능성이 없다는 의견을 덧붙일 것이다.
Barry

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 / the 코드 또는 삼항 연산자를 추가 할 수 있지만 IMO는 단순히 2 행을 ...로 변경하는 것이 더 깨끗합니다.

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

... 한 json_decode번에 수백만 개의 큰 배열을 사용 하지 않으면 @ TCB13이 지적한 것처럼 성능에 부정적인 영향을 줄 수 있습니다.



6

PHP 문서 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
제안 CPU / 메모리의 낭비, 않습니다 정확히 같은, 내부적으로 훨씬 더 빨리. json_decode($object, true);true
TCB13

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_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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.