Le meilleur moyen de créer un objet vide en JSON avec PHP?

92

Pour créer un objet JSON vide, j'utilise généralement:

json_encode((object) null);

la conversion de null en objet fonctionne, mais y a-t-il un autre moyen préférable et / ou un problème avec cette solution?

pna
la source
Pourquoi convertirez-vous null en objet JSON? De plus, le résultat final ne serait-il pas {}? Vous pouvez simplement le faire.
Ayman Safadi
1
(objet) (array ()) peut-être? Votre solution sonne bien.
malletjo
1
json_encode()renvoie une chaîne, pas un objet. Pourquoi faire ceci? Est-ce que j'ai râté quelque chose?
Telmo Marques
2
en fait, "{}" sort comme une chaîne! Je veux un résultat comme: {"some_property": {}} qui est un objet json vide. Je convertis un null en objet car je ne connais aucune autre solution pour le moment;)
pna
J'aime votre solution 8]
Andrew

Réponses:

111

Votre solution pourrait fonctionner.

La documentation précise qu'il (object) nullen résultera un objet vide, certains pourraient donc dire que votre code est valide et que c'est la méthode à utiliser.

PHP: Objets - Manuel

Si une valeur d'un autre type est convertie en objet, une nouvelle instance de la classe intégrée stdClass est créée. Si la valeur était NULL, la nouvelle instance sera vide.


.. mais, essayez de le garder en sécurité!

Bien que vous ne sachiez jamais quand / si ce qui précède va changer, donc si vous souhaitez être sûr à 100% que vous vous retrouverez toujours avec un {}dans vos données encodées, vous pouvez utiliser un hack tel que:

json_encode (json_decode ("{}"));

Même si c'est fastidieux et laid, je suppose / j'espère que json_encode / json_decode est compatible avec l'un et l'autre et évaluera toujours ce qui suit à vrai:

$a = <something>;

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

Méthode recommandée

json_decode ("{}")renverra un stdClasspar défaut, en utilisant ce qui suit devrait donc être considéré comme sûr. Cependant, comme mentionné, c'est à peu près la même chose que de faire (object) null.

json_encode (new stdClass);
Filip Roséen - Refp
la source
1
après avoir utilisé "new ArrayObject ()" ou "(object) null" je reçois => "Object" et non "{}" comme réponse. en utilisant php 5.6.29.
rohitmb
81

Si vous utilisez des objets comme dictionnaires dynamiques (et je suppose que vous le faites), alors je pense que vous voulez utiliser un ArrayObject .

Il correspond au dictionnaire JSON même lorsqu'il est vide. C'est génial si vous avez besoin de faire la distinction entre les listes (tableaux) et les dictionnaires (tableaux associatifs):

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

Vous pouvez également le manipuler de manière transparente (comme vous le feriez avec un tableau associatif), et il continuera à s'afficher correctement dans un dictionnaire:

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

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

Si vous avez besoin que cela soit 100% compatible dans les deux sens , vous pouvez également envelopper json_decodepour qu'il retourne à la ArrayObjectsplace des stdClassobjets (vous devrez parcourir l'arborescence des résultats et remplacer récursivement tous les objets, ce qui est une tâche assez facile).

Gotchas . Un seul que j'ai trouvé jusqu'à présent: is_array(new ArrayObject())évalue à false. Vous devez rechercher et remplacer les is_arrayoccurrences par is_iterable.

Wrygiel
la source
5
C'est la réponse la plus correcte ici, elle fait exactement ce qui est nécessaire dans ce cas
Avi Kapuya
2
Merci, c'est la meilleure réponse et répond exactement à mes besoins. Avant de lire ceci, mon code a commencé par jsonResponse = array(), puis il a été rempli dynamiquement par une boucle. Si la boucle n'avait pas une seule itération, l'objet "vide" (ou dictionnaire, comme vous l'appelez) était codé comme []tandis que tous les autres cas étaient codés comme "{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 = {}` et ne pas utiliser json_encode du tout est inutile.
user2690527
Le gotcha ne devrait pas s'appliquer - depuis les ArrayObjectimplémentations iterable, vous pouvez faire les deux is_iterable($foo)et utiliser l' iterableindicateur de type à la place de array, ce que vous devriez faire de toute façon pour vous laisser la possibilité de passer des instances de ArrayAccess, par exemple.
Moritz Friedrich
Cool! Mise à jour de la réponse.
wrygiel
17

Eh bien, json_encode()renvoie simplement une chaîne d'un tableau PHP / objet / etc. Vous pouvez obtenir le même effet beaucoup plus efficacement en faisant:

$json = '{}';

Il n'y a vraiment aucun intérêt à utiliser une fonction pour accomplir cela.

MISE À JOUR Selon les mises à jour de vos commentaires, vous pouvez essayer:

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

Même si je ne suis pas sûr que ce soit mieux que ce que vous faites.

rdlowrey
la source
1
non, c'est une chaîne avec des parenthèses à l'intérieur, je veux réaliser quelque chose comme: {"some_properties": {}} ... NOT {"some_properties": "{}"} qui est différent.
pna
Oh merde, j'ai passé trop de temps à écrire mon post .. 8 minutes trop tard haha!
Filip Roséen - refp
@refp Haha difficile de rivaliser avec la réponse encyclopédique :)
rdlowrey
hehe désolé rdlowrey mais @refp était très exhaustif;)
pna
9

Pour créer un objet vide en JSON avec PHP, j'ai utilisé

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

qui a produit

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

ce qui est nécessaire, car plus tard je dois le faire

if(is_object($json))
snow6oy
la source
5

Je fais toujours (Object)[];, comme:

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

... jouer avec en PHP ...

$json = json_encode($json);

... maintenant c'est du vrai JSON ...

Anuga
la source
2

json_encode($array, JSON_FORCE_OBJECT)le fera aussi. voir https://www.php.net/manual/en/function.json-encode.php

Marc Steven Plotz
la source
Merci ... Mais gardez à l'esprit que cette solution convertit également un tableau non indexé en objet avec des paires clé / valeur. Par exemple: json_encode(['a', 'b'], JSON_FORCE_OBJECT)reviendrait{"0": "a", "1": "b"}
Fendi Setiawan
1

vous pouvez aussi utiliser

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

json_encode($var);
rishabh parashar
la source