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.
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:
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.
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):
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:
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.
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:
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é
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"}
json_encode()
renvoie une chaîne, pas un objet. Pourquoi faire ceci? Est-ce que j'ai râté quelque chose?Réponses:
Votre solution pourrait fonctionner.
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... 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: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:
Méthode recommandée
json_decode ("{}")
renverra unstdClass
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
.la source
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):
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:
Si vous avez besoin que cela soit 100% compatible dans les deux sens , vous pouvez également envelopper
json_decode
pour qu'il retourne à laArrayObjects
place desstdClass
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 lesis_array
occurrences paris_iterable
.la source
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émentationsiterable
, vous pouvez faire les deuxis_iterable($foo)
et utiliser l'iterable
indicateur de type à la place dearray
, ce que vous devriez faire de toute façon pour vous laisser la possibilité de passer des instances deArrayAccess
, 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: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:
Même si je ne suis pas sûr que ce soit mieux que ce que vous faites.
la source
Pour créer un objet vide en JSON avec PHP, j'ai utilisé
qui a produit
ce qui est nécessaire, car plus tard je dois le faire
la source
Je fais toujours
(Object)[];
, comme:... jouer avec en PHP ...
... maintenant c'est du vrai JSON ...
la source
json_encode($array, JSON_FORCE_OBJECT)
le fera aussi. voir https://www.php.net/manual/en/function.json-encode.phpla source
json_encode(['a', 'b'], JSON_FORCE_OBJECT)
reviendrait{"0": "a", "1": "b"}
vous pouvez aussi utiliser
la source