J'ai un problème avec la fonction PHP json_encode. Il encode les nombres sous forme de chaînes, par exemple
array('id' => 3)
devient
"{ ["id": "3", ...)
Lorsque js rencontre ces valeurs, il les interprète comme des chaînes et les opérations numériques échouent sur elles. Est-ce que quelqu'un connaît un moyen d'empêcher json_encode
d'encoder des nombres sous forme de chaînes? Je vous remercie!
php
javascript
json
Chris Barnhill
la source
la source
Réponses:
J'ai fait un test très rapide:
Cela semble être comme ce que vous décrivez, si je ne me trompe pas?
Et je reçois en sortie:
Donc, dans ce cas, les entiers n'ont pas été convertis en chaîne.
Pourtant, cela peut dépendre de la version de PHP que nous utilisons: il y a eu quelques bogues liés à json_encode corrigés, en fonction de la version de PHP ...
Ce test a été réalisé avec PHP 5.2.6; J'obtiens la même chose avec PHP 5.2.9 et 5.3.0; Je n'ai pas d'autre version 5.2.x à tester, cependant :-(
Quelle version de PHP utilisez-vous? Ou votre cas de test est-il plus complexe que l'exemple que vous avez publié?
Peut-être qu'un rapport de bogue sur http://bugs.php.net/ pourrait être lié? Par exemple, bogue n ° 40503: la conversion d'entiers json_encode est incompatible avec PHP ?
Peut-être que le bogue n ° 38680 pourrait vous intéresser aussi, btw?
la source
Notez que depuis PHP 5.3.3, il existe un indicateur pour la conversion automatique des nombres (le paramètre options a été ajouté dans PHP 5.3.0):
la source
JSON_NUMERIC_CHECK
tente de deviner automatiquement si une chaîne est un nombre ou non en essayant de l'analyser. C'est assez peu fiable si vous y réfléchissez. Il convertira toutes les propriétés numériques en nombres (pas seulement celles que vous voulez) et cela ne le fera que si elles ressemblent à des nombres. C'est au moins fragile sinon dangereux. Le code qui consomme le JSON produit peut dépendre du type étant l'un ou l'autre. Des choses étranges peuvent arriver si ces attentes ne sont pas satisfaites. Si vous vous souciez des bonnes pratiques et de la sécurité, vous devez convertir sélectivement les valeurs souhaitées.Moi aussi je lisais à partir d'une base de données (PostgreSQL) et tout était une chaîne. Nous bouclons sur chaque ligne et faisons des choses avec pour construire notre tableau de résultats finaux, alors j'ai utilisé
dans la boucle pour le forcer à être une valeur entière. Quand je le fais
json_encode($result_arr)
maintenant, il le formate correctement sous forme de nombre. Cela vous permet de contrôler ce qui est et n'est pas un nombre provenant de votre base de données.ÉDITER:
La
json_encode()
fonction a également la capacité de le faire à la volée en utilisant leJSON_NUMERIC_CHECK
drapeau comme deuxième argument. Vous devez cependant faire attention à l'utiliser comme indiqué dans cet exemple utilisateur dans la documentation (copiée ci-dessous): http://uk3.php.net/manual/en/function.json-encode.php#106641Et puis vous obtenez ce JSON:
la source
json_encode
fonction. c'est la réponse la plus correcte, mais soyez prudent carJSON_NUMERIC_CHECK
convertit également les numéros de téléphone et autres valeurs de chaînes numériques, et cela pourrait poser des problèmes dans les zéros de tête ou '+' ... Je suggère de corriger ce problème dans la fonction de lecture de la base de données.essayer
$arr = array('var1' => 100, 'var2' => 200);
$json = json_encode( $arr, JSON_NUMERIC_CHECK);
Mais cela ne fonctionne que sur PHP 5.3.3. Regardez ce journal des modifications PHP json_encode http://php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog
la source
Je rencontre le même problème (PHP-5.2.11 / Windows). J'utilise cette solution de contournement
qui remplace tous les nombres (non négatifs, entiers) entre guillemets par le nombre lui-même («42» devient «42»).
Voir aussi ce commentaire dans le manuel PHP .
la source
$json_array = json_encode($some_array, false);
Ainsi, le faux argument indique à PHP de ne pas effectuer la conversion d'objet.json_encode(array(-1=>'que', '0'=>'-1'))
$this->data = preg_replace("/\" *?: *?(\d+)/", '":"$1"', $this->data);
Le test suivant confirme que le changement du type en chaîne fait que json_encode () renvoie un numérique sous forme de chaîne JSON (c'est-à-dire entouré de guillemets doubles). Utilisez settype (arr ["var"], "integer") ou settype ($ arr ["var"], "float") pour le corriger.
la source
Par souci d'exhaustivité (car je ne peux pas encore ajouter de commentaires), permettez-moi également d'ajouter ce détail comme une autre réponse:
(Edit: A lire après s'être rendu compte que les données source (c'est-à-dire dans le cas de l'OP, l'ensemble de résultats de la base de données) pourraient être le problème (en renvoyant des colonnes numériques sous forme de chaînes), et json_encode () en fait n'était pas la source du problème)
Pages de manuel des deux " mysql_fetch_array ":
... et " mysql_ fetch_ row ":
indique clairement que; les entrées du tableau renvoyé seront des chaînes.
(J'utilisais la classe DB dans phpBB2 (oui je sais, c'est obsolète!), Et la méthode "sql_fetchrow ()" de cette classe utilise "mysql_fetch_array ()")
Sans m'en rendre compte, j'ai aussi fini par trouver cette question, et comprendre le problème! :)
Comme Pascal Martin l'a déclaré ci-dessus dans ses commentaires de suivi, je crois qu'une solution qui prend en charge le problème du "type incorrect" à la source (c'est-à-dire en utilisant la fonction " mysql_field_type () " et en faisant le casting juste après fetch, (ou d'autres méthodes de récupération comme "objet"?)) seraient les meilleures en général.
la source
Donc Pascal MARTIN n'obtient pas assez de crédit ici. La vérification des valeurs numériques à chaque retour JSON n'est pas possible pour un projet existant avec des centaines de fonctions côté serveur.
J'ai remplacé php-mysql par php-mysqlnd, et le problème a disparu. Les nombres sont des nombres, les chaînes sont des chaînes, les booléens sont des booléens.
la source
J'ai également eu le même problème de traitement des données de la base de données. Fondamentalement, le problème est que le type du tableau à convertir en json, est reconnu par PHP comme une chaîne et non comme un entier. Dans mon cas, j'ai fait une requête qui renvoie des données à partir d'une ligne de comptage de colonne DB. Le pilote PDO ne reconnaît pas la colonne comme int, mais comme chaînes. J'ai résolu en effectuant un cast comme int dans la colonne affectée.
la source
la source
c'est la version php le problème, le même problème a été mis à niveau ma version php à 5.6 a résolu le problème
la source
Le cast des valeurs en int ou float semble résoudre ce problème. Par exemple:
la source
Vous pouvez utiliser (int) si un problème survient !! Cela fonctionnera très bien.
la source
Il suffit de rencontrer le même problème et la base de données renvoyait les valeurs sous forme de chaînes.
J'utilise ceci comme solution de contournement:
C'est multiplier la valeur par 1 pour la convertir en nombre
J'espère que ça aide quelqu'un
la source
json_encode sérialise une structure de données au format JSON à envoyer sur le réseau. Par conséquent, tout le contenu sera de type chaîne. Tout comme lorsque vous recevez un paramètre de $ _POST ou $ _GET.
Si vous devez effectuer des opérations numériques sur les valeurs envoyées, convertissez-les d'abord en int (avec la fonction intval () en PHP ou parseInt () en Javascript) puis exécutez les opérations.
la source
Eh bien, PHP json_encode () renvoie une chaîne.
Vous pouvez cependant utiliser parseFloat () ou parseInt () dans le code js:
la source
Comme oli_arborum l'a dit, je pense que vous pouvez utiliser un
preg_replace
pour faire le travail. Changez simplement la commande comme ceci:la source