Najlepszy sposób na utworzenie pustego obiektu w formacie JSON za pomocą PHP?

96

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?

pna
źródło
Dlaczego warto przekonwertować wartość null na obiekt JSON? Ponadto, czy wynik końcowy nie byłby {}? Możesz to po prostu zrobić.
Ayman Safadi
1
(obiekt) (tablica ()) może? Twoje rozwiązanie brzmi dobrze.
malletjo
1
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.

PHP: Objects - Manual

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:

$a = <something>;

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

Zalecana metoda

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);
Filip Roséen - ref
źródło
1
po użyciu „new ArrayObject ()” lub „(object) null” otrzymuję => „Object”, a nie „{}” jako odpowiedź. używając php 5.6.29.
rohitmb
84

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.

wrygiel
źródło
5
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ć:

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

Chociaż nie jestem pewien, czy to lepsze niż to, co robiłeś.

rdlowrey
źródło
1
nie, to jest ciąg z pewnym nawiasem w środku, chcę osiągnąć coś takiego: {"some_properties": {}} ... NOT {"some_properties": "{}"} to coś innego.
pna
O cholera, spędziłem zbyt dużo czasu na pisaniu mojego postu .. 8 minut za późno haha!
Filip Roséen - odniesienie
@refp Haha trudno konkurować z encyklopedyczną odpowiedzią :)
rdlowrey
hehe przepraszam rdlowrey, ale @refp był bardzo wyczerpujący;)
pna
10

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))
snow6oy
źródło
5

Zawsze tak robię (Object)[];:

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

... pobaw się tym w PHP ...

$json = json_encode($json);

... teraz to prawdziwy JSON ...

Anuga
źródło
2

json_encode($array, JSON_FORCE_OBJECT)też to zrobi. zobacz https://www.php.net/manual/en/function.json-encode.php

Marc Steven Plotz
źródło
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"}
Fendi Setiawan
1

możesz także użyć

$var = ["key" => (object) array()];

json_encode($var);
rishabh parashar
źródło