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?
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?
json_encode()
renvoie une chaîne, pas un objet. Pourquoi faire ceci? Est-ce que j'ai râté quelque chose?
Réponses:
La documentation précise qu'il (object) null
en résultera un objet vide, certains pourraient donc dire que votre code est valide et que c'est la méthode à utiliser.
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.
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));
json_decode ("{}")
renverra un stdClass
par 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);
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_decode
pour qu'il retourne à la ArrayObjects
place des stdClass
objets (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_array
occurrences par is_iterable
.
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.
ArrayObject
implémentations iterable
, vous pouvez faire les deux is_iterable($foo)
et utiliser l' iterable
indicateur 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.
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.
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))
json_encode($array, JSON_FORCE_OBJECT)
le fera aussi. voir https://www.php.net/manual/en/function.json-encode.php
json_encode(['a', 'b'], JSON_FORCE_OBJECT)
reviendrait{"0": "a", "1": "b"}
vous pouvez aussi utiliser
$var = ["key" => (object) array()];
json_encode($var);