json_encode()zwraca String, a nie obiekt. Czemu to robić? Czy coś mi umyka?
Telmo Marques
2
cóż, faktycznie "{}" pojawia się jako ciąg! Chcę wyniku takiego jak: {"some_property": {}}, który jest pustym obiektem json. Konwertuję wartość null na obiekt, bo na razie nie znam żadnego innego rozwiązania;)
pna
Podoba mi się twoje rozwiązanie 8]
Andrew
Odpowiedzi:
116
Twoje rozwiązanie może działać ...
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.
.. ale staraj się, aby było bezpieczne!
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:
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.
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.
To jest najbardziej poprawna odpowiedź tutaj, robi dokładnie to, co jest potrzebne w tym przypadku
Avi Kapuya.
2
Dzięki, to najlepsza odpowiedź i dokładnie odpowiada moim potrzebom. Przed przeczytaniem tego, mój kod zaczynał się od, 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
kodu
Gotcha nie powinien mieć zastosowania - ponieważ 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.
Moritz Friedrich
Fajne! Zaktualizowałem odpowiedź.
wrygiel
17
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ć:
Dzięki ... Ale pamiętaj, że to rozwiązanie również konwertuje tablicę nieindeksowaną na obiekt z parami klucz-wartość. Np .: json_encode(['a', 'b'], JSON_FORCE_OBJECT)wróci{"0": "a", "1": "b"}
json_encode()
zwraca String, a nie obiekt. Czemu to robić? Czy coś mi umyka?Odpowiedzi:
Twoje rozwiązanie może działać ...
Dokumentacja określa, że
(object) null
spowoduje 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... ale staraj się, aby było bezpieczne!
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:
Zalecana metoda
json_decode ("{}")
zwróci wartośćstdClass
domyś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);
źródło
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_decode
aby zwracałArrayObjects
zamiaststdClass
obiektó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())
oceniafalse
. Musisz znaleźć i zamienićis_array
wystąpienia nais_iterable
.źródło
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 niestosowanieArrayObject
narzędziaiterable
, możesz zrobić zarówno jedno,is_iterable($foo)
jak i drugieiterable
zamiast podpowiedzi typuarray
, co i tak powinieneś zrobić, aby zostawić sobie opcję przekazywania na przykład instancjiArrayAccess
.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ś.
źródło
Do stworzenia pustego obiektu w JSON z PHP użyłem
$json=json_decode('{}'); $json->status=202; $json->message='Accepted'; print_r($json);
który wyprodukował
stdClass Object ( [status] => 202 [message] => Accepted )
co jest konieczne, bo później muszę to zrobić
if(is_object($json))
źródło
Zawsze tak robię
(Object)[];
:$json = (Object)[]; // [] could also be array()
... pobaw się tym w PHP ...
... teraz to prawdziwy JSON ...
źródło
json_encode($array, JSON_FORCE_OBJECT)
też to zrobi. zobacz https://www.php.net/manual/en/function.json-encode.phpźródło
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);
źródło