빈 JSON 개체를 만들려면 일반적으로 다음을 사용합니다.
json_encode((object) null);
개체에 null을 캐스팅하면 작동하지만 다른 바람직한 방법 및 / 또는이 솔루션에 문제가 있습니까?
빈 JSON 개체를 만들려면 일반적으로 다음을 사용합니다.
json_encode((object) null);
개체에 null을 캐스팅하면 작동하지만 다른 바람직한 방법 및 / 또는이 솔루션에 문제가 있습니까?
json_encode()
객체가 아닌 문자열을 반환합니다. 왜 이러나요? 여기에 뭔가 빠졌나요?
답변:
문서 (object) null
는 빈 객체 가 될 것이라고 명시하고 있으며, 일부는 코드가 유효하고 사용할 방법이라고 말할 수 있습니다.
다른 유형의 값이 객체로 변환되면 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);
객체를 동적 사전으로 사용하는 경우 (그리고 그렇게 생각합니다) 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
반환되도록 래핑 할 수도 있습니다 (결과 트리를 살펴보고 모든 객체를 재귀 적으로 교체해야하므로 매우 쉬운 작업입니다).ArrayObjects
stdClass
Gotchas . 하나의 I의 한 지금까지 발견 : is_array(new ArrayObject())
평가합니다에 false
. is_array
발생 을 찾아서 is_iterable
.
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는 무의미하다.
ArrayObject
구현 iterable
이므로 대신 유형 힌트 is_iterable($foo)
를 사용할 수있을 뿐만 아니라 , 예를 들어의 인스턴스를 전달하는 옵션을 남겨 두려면 어쨌든해야합니다 . iterable
array
ArrayAccess
잘, json_encode()
단순히 PHP 배열 / 객체 / 등에서 문자열을 반환합니다. 다음을 수행하여 동일한 효과를 훨씬 더 효율적으로 얻을 수 있습니다.
$json = '{}';
이 작업을 수행하기 위해 함수를 사용하는 것은 의미가 없습니다.
업데이트 귀하의 의견 업데이트에 따라 다음을 시도 할 수 있습니다.
$test = json_encode(array('some_properties'=>new stdClass));
그게 당신이해온 것보다 더 나은지 모르겠지만.
json_encode($array, JSON_FORCE_OBJECT)
그것도 할 것입니다. 참조 https://www.php.net/manual/en/function.json-encode.php를
json_encode(['a', 'b'], JSON_FORCE_OBJECT)
돌아올 것입니다{"0": "a", "1": "b"}
당신은 또한 사용할 수 있습니다
$var = ["key" => (object) array()];
json_encode($var);