json_encode / json_decode-PHP에서 Array 대신 stdClass 반환


108

이 작은 스크립트를 관찰하십시오.

$array = array('stuff' => 'things');
print_r($array);
//prints - Array ( [stuff] => things )
$arrayEncoded = json_encode($array);
echo $arrayEncoded . "<br />";
//prints - {"stuff":"things"}
$arrayDecoded = json_decode($arrayEncoded);
print_r($arrayDecoded);
//prints - stdClass Object ( [stuff] => things )

PHP가 JSON 객체를 클래스로 바꾸는 이유는 무엇입니까?

json_encoded그런 다음 json_decoded정확히 동일한 결과 를 산출 하는 배열이 안 됩니까?

답변:


145

https://secure.php.net/json_decodejson_decode($json, $assoc, $depth) 에서 두 번째 매개 변수를 자세히 살펴보십시오.


7
질문에 대답하지 않습니다. 왜 stdClass가 기본값입니까? 참조 stackoverflow.com/questions/3193765/…
William Entriken 2014-04-24

7
이것은 실제로 질문에 대한 대답이 아니라 해결 방법을 제공 할뿐입니다. 그러나 형편없는 해결책, IMO. json으로 인코딩 된 객체를 객체로 디코딩하고 json으로 디코딩 한 연관 배열을 연관 배열로 자동으로 디코딩하려면 어떻게해야합니까? json_decode ()에 두 번째 매개 변수를 사용하는 것은 일종의 인간 개입을 의미합니다. 솔직히, 이것은 짜증납니다 (이 답변이 아니라 PHP)
JDS

@JDS를 사용하면 이러한 함수를 매우 쉽게 래핑하고 필요한 경우 json 키에 소스 유형을 투명하게 저장하는 고유 한 함수를 만들 수 있습니다.
sivann 2014

2
@JDS "PHP가 JSON 객체를 클래스로 바꾸는 이유는 무엇입니까?"라는 질문에 실제로 대답하는 답변을 추가했습니다.
7ochem 2015 년

82
$arrayDecoded = json_decode($arrayEncoded, true);

배열을 제공합니다.


2
이것은 매우 큰 도움이됩니다. @Kai Chain에게 감사드립니다. 원래 질문은 "왜"라고 묻고 있었지만 의도 한 바에 도달 한 것 같습니다. 어떤 경우이든 내 상황에 완벽합니다.
ghukill

그리고 여기서 4 년 만에 같은 일을합니다! 나처럼 모두가 먼저 공부해야한다는 기본 지식!
KJS

20

실제 질문에 답하려면 :

PHP가 JSON 객체를 클래스로 바꾸는 이유는 무엇입니까?

인코딩 된 JSON의 출력을 자세히 살펴보면 OP가 제공하는 예제를 확장했습니다.

$array = array(
    'stuff' => 'things',
    'things' => array(
        'controller', 'playing card', 'newspaper', 'sand paper', 'monitor', 'tree'
    )
);
$arrayEncoded = json_encode($array);
echo $arrayEncoded;
//prints - {"stuff":"things","things":["controller","playing card","newspaper","sand paper","monitor","tree"]}

JSON 형식은 JavaScript ( ECMAScript Programming Language Standard )와 동일한 표준에서 파생되었으며 형식을 살펴보면 JavaScript처럼 보입니다. 이것은 값이 "things"인 "stuff"속성을 갖는 JSON 객체 ( {}= object )이며 값이 문자열 []배열 ( = array ) 인 "things"속성을가 집니다.

JSON (JavaScript)은 연관 배열 만 인덱싱 된 배열을 알지 못합니다. 따라서 JSON이 PHP 연관 배열을 인코딩 할 때이 배열을 "객체"로 포함하는 JSON 문자열이 생성됩니다.

이제 .NET을 사용하여 JSON을 다시 디코딩합니다 json_decode($arrayEncoded). 디코드 함수는이 JSON 문자열의 출처 (PHP 배열)를 알지 못하므로 PHP에있는 알 수없는 개체로 디코딩 stdClass합니다. 보시다시피 문자열의 "things"배열은 색인 된 PHP 배열로 디코딩됩니다.

참조 :


'사물'에 대한 https://www.randomlists.com/things 덕분에


2
이것은 정답입니다 ... 그것은 질문에 대한 답변이고 다른 것들은 설명되지 않은 문제에 대한 해결 방법을 제공합니다. 감사합니다. 저는 JSON이 연관 배열을 지원하지 않는다는 사실을 잊고 서클에 들어갔습니다!
marcus 2010-08-26

5

언급했듯이 여기에 두 번째 매개 변수를 추가하여 배열을 반환 할 것을 나타낼 수 있습니다.

$array = json_decode($json, true);

많은 사람들이 대신 결과를 캐스팅하는 것을 선호 할 수 있습니다.

$array = (array)json_decode($json);

읽기가 더 명확 할 수 있습니다.


4
다릅니다. 다차원 배열 또는 객체를 인코딩했는지 확인하십시오. 첫 번째는 배열의 배열을 제공하고 두 번째는 객체의 배열을 제공합니다.
Hector

2

tl; dr : JavaScript는 연관 배열을 지원하지 않으므로 JSON도 지원하지 않습니다.

결국 JSAAN이 아니라 JSON입니다. :)

따라서 PHP는 JSON으로 인코딩하기 위해 배열을 객체로 변환해야합니다.


1
    var_dump(json_decode('{"0":0}'));    // output: object(0=>0)
    var_dump(json_decode('[0]'));          //output: [0]

    var_dump(json_decode('{"0":0}', true));//output: [0]
    var_dump(json_decode('[0]', true));    //output: [0]

json을 배열로 디코딩하면이 상황에서 정보가 손실됩니다.


0

또한 PHP4에서 json_encode () 및 json_decode () 사용 (2009 년 6 월) 블로그 게시물에 작성된 좋은 PHP 4 json 인코딩 / 디코드 라이브러리 (즉, PHP 5 역 호환 가능 )도 있습니다.

구체적인 코드는 Michal Migurski와 Matt Knapp이 작성했습니다.

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