Il modo migliore per creare un oggetto vuoto in JSON con PHP?


93

Per creare un oggetto JSON vuoto che utilizzo di solito:

json_encode((object) null);

casting null su un oggetto funziona, ma c'è qualche altro modo preferibile e / o qualche problema con questa soluzione?


Perché dovresti convertire null in un oggetto JSON? Inoltre, il risultato finale non sarebbe {}? Potresti semplicemente farlo.
Ayman Safadi

1
(oggetto) (array ()) forse? La tua soluzione suona bene.
malletjo

1
json_encode()restituisce una stringa, non un oggetto. Perché fare questo? Mi manca qualcosa qui?
Telmo Marques

2
beh, in realtà "{}" esce come una stringa! Voglio un risultato come: {"some_property": {}} che è un oggetto json vuoto. Converto un valore nullo in oggetto perché per ora non conosco altre soluzioni;)
pna

Mi piace la tua soluzione 8]
Andrew

Risposte:


112

La tua soluzione potrebbe funzionare ..

La documentazione specifica che (object) nullrisulterà in un oggetto vuoto, alcuni potrebbero quindi dire che il tuo codice è valido e che è il metodo da usare.

PHP: Oggetti - Manuale

Se un valore di qualsiasi altro tipo viene convertito in un oggetto, viene creata una nuova istanza della classe incorporata stdClass. Se il valore era NULL, la nuova istanza sarà vuota.


.. ma cerca di tenerlo al sicuro!

Anche se non sai mai quando / se quanto sopra cambierà, quindi se vuoi essere sicuro al 100% che ti ritroverai sempre con un {}nei tuoi dati codificati potresti usare un hack come:

json_encode (json_decode ("{}"));

Anche se è noioso e brutto, presumo / spero che json_encode / json_decode sia compatibile con uno e l'altro e valuterà sempre quanto segue come true:

$a = <something>;

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

Metodo consigliato

json_decode ("{}")restituirà un stdClassper impostazione predefinita, utilizzando quanto segue dovrebbe quindi essere considerato sicuro. Tuttavia, come accennato, è più o meno la stessa cosa che fare (object) null.

json_encode (new stdClass);

1
dopo aver usato "new ArrayObject ()" o "(object) null" ricevo => "Object" e non "{}" come risposta. utilizzando php 5.6.29.
rohitmb

81

Se usi oggetti come dizionari dinamici (e immagino che tu lo faccia), allora penso che tu voglia usare un ArrayObject .

Viene mappato nel dizionario JSON anche quando è vuoto. È ottimo se devi distinguere tra elenchi (array) e dizionari (array associativi):

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

Puoi anche manipolarlo senza problemi (come faresti con un array associativo) e continuerà a essere visualizzato correttamente in un dizionario:

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

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

Se hai bisogno che sia compatibile al 100% in entrambi i modi , puoi anche eseguire il wrapping in json_decodemodo che ritorni al ArrayObjectsposto degli stdClassoggetti (dovrai percorrere l'albero dei risultati e sostituire ricorsivamente tutti gli oggetti, il che è un compito abbastanza facile).

Gotchas . Solo uno che ho trovato finora: is_array(new ArrayObject())restituisce false. Devi trovare e sostituire le is_arrayoccorrenze con is_iterable.


5
Questa è la risposta più corretta qui, fa esattamente ciò che è necessario in questo caso
Avi Kapuya

2
Grazie, questa è la risposta migliore e si adatta esattamente alle mie esigenze. Prima di leggere questo, il mio codice è iniziato con jsonResponse = array()e poi è stato riempito dinamicamente da un ciclo. Se il ciclo non aveva una singola iterazione l'oggetto "vuoto" (o dizionario, come lo chiami tu) era codificato come []mentre tutti gli altri casi erano codificati come "{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 = {}" e non usare affatto json_encode è inutile.
user2690527

Il gotcha non dovrebbe essere applicato - poiché ArrayObjectimplementa iterable, puoi fare entrambe is_iterable($foo)le cose così come usare il iterablesuggerimento sul tipo invece di array, cosa che dovresti fare comunque per lasciare a te stesso la possibilità di passare istanze ArrayAccess, ad esempio.
Moritz Friedrich

Freddo! Aggiornata la risposta.
wrygiel

17

Bene, json_encode()restituisce semplicemente una stringa da un array / oggetto / ecc. PHP. Puoi ottenere lo stesso effetto in modo molto più efficiente facendo:

$json = '{}';

Non ha davvero senso usare una funzione per ottenere questo risultato.

AGGIORNAMENTO In base agli aggiornamenti dei tuoi commenti, potresti provare:

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

Anche se non sono sicuro che sia meglio di quello che hai fatto tu.


1
no, questa è una stringa con alcune parentesi all'interno, voglio ottenere qualcosa come: {"some_properties": {}} ... NON {"some_properties": "{}"} che è diverso.
pna

Oh merda, ho passato troppo tempo a scrivere il mio post .. 8 minuti troppo tardi ahah!
Filip Roséen - refp

@refp Haha difficile competere con la risposta enciclopedica :)
rdlowrey

hehe dispiace rdlowrey ma @refp è stato molto esauriente;)
pna

9

Per creare un oggetto vuoto in JSON con PHP ho usato

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

che ha prodotto

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

che è necessario, perché più tardi devo farlo

if(is_object($json))

5

Lo faccio sempre (Object)[];, come:

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

... giocaci un po 'in PHP ...

$json = json_encode($json);

... ora è vero JSON ...



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.