Aby utworzyć pusty obiekt JSON, zwykle używam:
json_encode((object) null);
rzutowanie wartości null na obiekt działa, ale czy jest inny preferowany sposób i / lub jakiś problem z tym rozwiązaniem?
Aby utworzyć pusty obiekt JSON, zwykle używam:
json_encode((object) null);
rzutowanie wartości null na obiekt działa, ale czy jest inny preferowany sposób i / lub jakiś problem z tym rozwiązaniem?
json_encode()zwraca String, a nie obiekt. Czemu to robić? Czy coś mi umyka?
Odpowiedzi:
Dokumentacja określa, że (object) nullspowoduje to powstanie pustego obiektu, niektórzy mogą więc powiedzieć, że twój kod jest prawidłowy i że jest to metoda do użycia.
Jeśli wartość dowolnego innego typu zostanie przekonwertowana na obiekt, zostanie utworzone nowe wystąpienie klasy wbudowanej stdClass. Jeśli wartość była równa NULL, nowa instancja będzie pusta.
Chociaż nigdy nie wiesz, kiedy / czy powyższe zmiany ulegną zmianie, więc jeśli chcesz mieć 100% pewności, że {}w zakodowanych danych zawsze znajdziesz a, możesz użyć hackowania, takiego jak:
json_encode (json_decode ("{}"));
Chociaż jest to żmudne i brzydkie, zakładam / mam nadzieję, że json_encode / json_decode jest kompatybilny z jednym i drugim i zawsze oceniam następujące wartości na true:
$a = <something>;
$a === json_decode (json_encode ($a));
json_decode ("{}")zwróci wartość stdClassdomyślną, użycie poniższej instrukcji powinno być zatem uważane za bezpieczne. Chociaż, jak wspomniano, jest to prawie to samo, co robienie (object) null.
json_encode (new stdClass);
Jeśli używasz obiektów jako dynamicznych słowników (i myślę, że tak), to myślę, że chcesz użyć ArrayObject .
Mapuje do słownika JSON, nawet gdy jest pusty. Świetnie, jeśli chcesz rozróżnić listy (tablice) i słowniki (tablice asocjacyjne):
$complex = array('list' => array(), 'dict' => new ArrayObject());
print json_encode($complex); // -> {"list":[],"dict":{}}
Możesz także bezproblemowo nim manipulować (tak jak w przypadku tablicy asocjacyjnej), a będzie on poprawnie renderowany w słowniku:
$complex['dict']['a'] = 123;
print json_encode($complex); // -> {"list":[],"dict":{"a":123}}
unset($complex['dict']['a']);
print json_encode($complex); // -> {"list":[],"dict":{}}
Jeśli chcesz, aby był w 100% zgodny w obie strony , możesz również zawinąć, json_decodeaby zwracał ArrayObjectszamiast stdClassobiektów (będziesz musiał przejść przez drzewo wyników i rekurencyjnie zastąpić wszystkie obiekty, co jest dość łatwym zadaniem).
Gotchas . Do tej pory znalazłem tylko jeden: is_array(new ArrayObject())ocenia false. Musisz znaleźć i zamienić is_arraywystąpienia na is_iterable.
jsonResponse = array()a następnie był dynamicznie wypełniany pętlą. Jeśli pętla nie miała ani jednej iteracji, „pusty” obiekt (lub słownik, jak go nazywasz) został zakodowany tak [], jak wszystkie inne przypadki zostały zakodowane jako „{attr_1: wartość1, ...} . 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 = {}” i niestosowanie
ArrayObjectnarzędzia iterable, możesz zrobić zarówno jedno, is_iterable($foo)jak i drugie iterablezamiast podpowiedzi typu array, co i tak powinieneś zrobić, aby zostawić sobie opcję przekazywania na przykład instancji ArrayAccess.
Cóż, json_encode()po prostu zwraca ciąg z tablicy / obiektu / itp. PHP. Możesz osiągnąć ten sam efekt znacznie wydajniej, wykonując:
$json = '{}';
Naprawdę nie ma sensu używać do tego funkcji.
AKTUALIZACJA Zgodnie z aktualizacjami komentarzy możesz spróbować:
$test = json_encode(array('some_properties'=>new stdClass));
Chociaż nie jestem pewien, czy to lepsze niż to, co robiłeś.
json_encode($array, JSON_FORCE_OBJECT)też to zrobi. zobacz https://www.php.net/manual/en/function.json-encode.php
json_encode(['a', 'b'], JSON_FORCE_OBJECT)wróci{"0": "a", "1": "b"}
możesz także użyć
$var = ["key" => (object) array()];
json_encode($var);