PHP로 JSON에서 빈 객체를 만드는 가장 좋은 방법은 무엇입니까?


93

빈 JSON 개체를 만들려면 일반적으로 다음을 사용합니다.

json_encode((object) null);

개체에 null을 캐스팅하면 작동하지만 다른 바람직한 방법 및 / 또는이 솔루션에 문제가 있습니까?


null을 JSON 객체로 변환하는 이유는 무엇입니까? 또한 최종 결과는 {}이 아닐까요? 그냥 할 수 있습니다.
Ayman Safadi

1
(object) (array ()) 어쩌면? 귀하의 솔루션은 좋은 것 같습니다.
malletjo 2011

1
json_encode()객체가 아닌 문자열을 반환합니다. 왜 이러나요? 여기에 뭔가 빠졌나요?
Telmo Marques 2011

2
사실 "{}"는 문자열로 나옵니다! 빈 json 객체 인 { "some_property": {}}와 같은 결과를 원합니다. 나는 현재 다른 해결책을 모른다는 이유로 null을 객체로 변환합니다.)
pna

나는 당신의 솔루션이 마음
Andrew

답변:


112

솔루션이 작동 할 수 있습니다 ..

문서 (object) null는 빈 객체 가 될 것이라고 명시하고 있으며, 일부는 코드가 유효하고 사용할 방법이라고 말할 수 있습니다.

PHP : 객체-Manual

다른 유형의 값이 객체로 변환되면 stdClass 내장 클래스의 새 인스턴스가 생성됩니다. 값이 NULL이면 새 인스턴스가 비어 있습니다.


..하지만 안전하게 보관하세요!

위의 내용이 언제 / 변경 될지 알 수는 없지만 항상 {}인코딩 된 데이터에서 끝날 것임을 100 % 확신 하려면 다음과 같은 해킹을 사용할 수 있습니다.

json_encode (json_decode ("{}"));

지루하고 추악하지만 json_encode / json_decode가 둘 중 하나와 호환되며 항상 다음을 true로 평가할 것이라고 가정 / 희망합니다.

$a = <something>;

$a === json_decode (json_encode ($a)); 

권장 방법

json_decode ("{}")stdClass안전한 것으로 간주되면 아래를 사용하여 기본값 을 반환합니다 . 언급했듯이 (object) null.

json_encode (new stdClass);

1
"new ArrayObject ()"또는 "(object) null"을 사용한 후 응답으로 '{}'가 아닌 => "Object"가 표시됩니다. PHP 5.6.29 사용.
rohitmb

81

객체를 동적 사전으로 사용하는 경우 (그리고 그렇게 생각합니다) ArrayObject 를 사용하고 싶다고 생각합니다 .

비어있는 경우에도 JSON 사전에 매핑됩니다. 목록 (배열)과 사전 (연관 배열)을 구별해야하는 경우 유용합니다.

$complex = array('list' => array(), 'dict' => new ArrayObject());
print json_encode($complex); // -> {"list":[],"dict":{}}

또한 연관 배열을 사용하는 것처럼 원활하게 조작 할 수 있으며 사전에 올바르게 렌더링됩니다.

$complex['dict']['a'] = 123;
print json_encode($complex); // -> {"list":[],"dict":{"a":123}}

unset($complex['dict']['a']);
print json_encode($complex); // -> {"list":[],"dict":{}}

이것이 가지 방식 으로 100 % 호환되어야 하는 경우 , 객체 대신 json_decode반환되도록 래핑 할 수도 있습니다 (결과 트리를 살펴보고 모든 객체를 재귀 적으로 교체해야하므로 매우 쉬운 작업입니다).ArrayObjectsstdClass

Gotchas . 하나의 I의 한 지금까지 발견 : is_array(new ArrayObject())평가합니다에 false. is_array발생 을 찾아서 is_iterable.


5
이것은이 경우에 필요한 정확하게 수행, 가장 정확한 답 여기에있다
아비 Kapuya

2
감사합니다. 이것이 최선의 답변이며 제 요구 사항에 정확히 부합합니다. 이것을 읽기 전에 내 코드는로 시작 jsonResponse = array()하여 루프로 동적으로 채워졌습니다. 루프에 단일 반복이없는 경우 "빈"객체 (또는 호출 한 사전)는 []다른 모든 경우가 "{attr_1 : value1, ...} . All the other answers around here have a flaw. They assume that one already knows if the dictionary is empty or not in advance. Especially the answer that tells one should simply write $ json = {}` 로 인코딩 된 것처럼 인코딩 되고 전혀 사용하지 않을로 json_encode는 무의미하다.
user2690527

이 문제는 적용되지 않아야합니다. ArrayObject구현 iterable이므로 대신 유형 힌트 is_iterable($foo)를 사용할 수있을 뿐만 아니라 , 예를 들어의 인스턴스를 전달하는 옵션을 남겨 두려면 어쨌든해야합니다 . iterablearrayArrayAccess
Moritz Friedrich

멋있는! 답변을 업데이트했습니다.
wrygiel

17

잘, json_encode() 단순히 PHP 배열 / 객체 / 등에서 문자열을 반환합니다. 다음을 수행하여 동일한 효과를 훨씬 더 효율적으로 얻을 수 있습니다.

$json = '{}';

이 작업을 수행하기 위해 함수를 사용하는 것은 의미가 없습니다.

업데이트 귀하의 의견 업데이트에 따라 다음을 시도 할 수 있습니다.

$test = json_encode(array('some_properties'=>new stdClass));

그게 당신이해온 것보다 더 나은지 모르겠지만.


1
아니요, 내부에 괄호가있는 문자열입니다. { "some_properties": {}} ... NOT { "some_properties": "{}"} 다른 것을 얻고 싶습니다.
pna

오 젠장, 내 글을 쓰는데 너무 많은 시간을 보냈어 .. 8 분 너무 늦었 어 하하!
Filip Roséen-refp

@refp Haha 백과 사전 답변과 경쟁하기 힘든 :)
rdlowrey

도니는 다르게 죄송 rdlowrey하지만 @refp은 매우 철저했다)
PNA

9

PHP로 JSON에서 빈 개체를 만들려면

$json=json_decode('{}');
$json->status=202;
$json->message='Accepted';
print_r($json);

생산 한

stdClass Object
(
    [status] => 202
    [message] => Accepted
)

나중에해야 하니까요

if(is_object($json))

5

나는 항상 다음 (Object)[];과 같이한다.

$json = (Object)[]; // [] could also be array()

... PHP에서 놀아 ...

$json = json_encode($json);

... 이제 실제 JSON입니다 ...



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