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?
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?
json_encode()
restituisce una stringa, non un oggetto. Perché fare questo? Mi manca qualcosa qui?
Risposte:
La documentazione specifica che (object) null
risulterà in un oggetto vuoto, alcuni potrebbero quindi dire che il tuo codice è valido e che è il metodo da usare.
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.
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));
json_decode ("{}")
restituirà un stdClass
per 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);
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_decode
modo che ritorni al ArrayObjects
posto degli stdClass
oggetti (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_array
occorrenze con is_iterable
.
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.
ArrayObject
implementa iterable
, puoi fare entrambe is_iterable($foo)
le cose così come usare il iterable
suggerimento sul tipo invece di array
, cosa che dovresti fare comunque per lasciare a te stesso la possibilità di passare istanze ArrayAccess
, ad esempio.
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.
json_encode($array, JSON_FORCE_OBJECT)
lo farà anche tu. vedere https://www.php.net/manual/en/function.json-encode.php
json_encode(['a', 'b'], JSON_FORCE_OBJECT)
sarebbe tornato{"0": "a", "1": "b"}
puoi anche usare
$var = ["key" => (object) array()];
json_encode($var);