2010-05-25 6 views
19

J'utilise FQL pour récupérer une liste d'utilisateurs de Facebook. Pour la cohérence, j'obtiens le résultat en JSON. Cela provoque un problème - étant donné que le code JSON renvoyé code les ID utilisateur en tant que nombres, json_decode() convertit ces nombres en valeurs à virgule flottante, car certains sont trop grands pour tenir dans un int; bien sûr, j'ai besoin de ces identifiants comme des chaînes.Gestion des gros ID utilisateur retournés par FQL en PHP

Puisque json_decode() fait sa propre chose sans accepter de drapeaux de comportement, je suis à court de ressources. Des suggestions sur la façon de résoudre ce problème?

Répondre

28

json_decode() peut convertir de grands entiers en chaînes, si vous spécifiez un drapeau dans l'appel de fonction:

$array = json_decode($json, true, 512, JSON_BIGINT_AS_STRING) 
+0

Aucune idée comment pourrais-je manquer que dans la documentation. Merci! – ggambett

+0

Ceci est seulement dans une version de développement de PHP - au moins selon la documentation sur php.net? –

+0

@Sebastian Hoitz, La page n'a pas été mise à jour depuis longtemps, d'après elle le paramètre devrait être disponible à partir de PHP 5.3 (qui a été publié il ya "longtemps"). –

5

rapide et sale, semble fonctionner pour l'instant:

$sJSON = preg_replace('/:(\d+)/', ':"${1}"', $sJSON); 
8

J'ai eu un semblable problème où json_decode était en train de convertir des identifiants twitter/tweet récents en nombres exponentiels.

La réponse de Björn est géniale si vous voulez que votre BIGINT devienne une chaîne - et ait PHP 5.3+. Si aucune de ces choses n'est vraie, une autre option consiste à augmenter la précision flottante de PHP. Cela peut être fait différentes façons ... quelques

  • trouver la valeur precision dans votre php.ini et de changer à precision = 20
  • ajouter ini_set('precision', 20); à votre application PHP
  • ajouter php_value precision 20 à votre application de. htaccess ou d'un fichier d'hôte virtuel
+0

Simple et facile. BTW, pouvons-nous ajuster le nombre «20» de sorte qu'il peut adapter à la valeur longue? –

+0

J'ajoute cette ligne à ma précision .htaccess php_value 20. Sur le premier site, cela fonctionne très bien. Mais quand j'ajoute ceci sur l'autre site, j'ai 500 erreur de serveur interne. Quel remplacement dois-je utiliser? –

20

J'ai résolu le problème en ajoutant &format=json-strings à mon appel api FQL, comme ceci:

$myQuery = "SELECT uid2 FROM friend WHERE uid1=me()"; 
$facebook->api("/fql?q=" . urlencode($myQuery) . "&format=json-strings") 

Cela dit facebook pour envelopper tous les chiffres entre guillemets, ce qui conduit à utiliser json_decode ni int-n'est pas flotteurs. Parce que j'avais peur que ce problème ne soit pas limité à FQL mais à tous les appels d'API de graphes qui choisissent de représenter certains des ID comme BIG-INT, je suis allé jusqu'à patcher un peu le SDK PHP de Facebook pour forcer Facebook à retourne tous ses nombres en tant que chaînes. J'ai ajouté cette ligne à la fonction _graph. Ce serait la ligne 738 dans facebook_base.php version 3.1.1

$params['format'] = 'json-strings'; 

Bien sûr corriger

+1

Cela fonctionne pour ceux d'entre nous qui n'utilisent pas le dernier PHP et n'ont donc pas JSON_BIGINT_AS_STRING. –

+0

C'était la réponse la plus solide pour moi. Juste au cas où vous tombez sur plus tard: $ myQuery = $ Facebook-> api ("/ fqï", tableau ( \t "q" => "SELECT UID2 d'un ami OÙ UID1 me =()", format » "=>" json-strings " )); – Fraccus

+0

c'est la meilleure réponse! – SteMa

3

J'utilise cela et il fonctionne presque grand.

json_decode(preg_replace('/("\w+"):(\d+)/', '\\1:"\\2"', $jsonString), true) 

Les sauts de json quand il y a des données géographiques incluses, par exemple.{"lat":54.2341} résultats dans "lat":"54".2341

Solution:

$json = preg_replace('/("\w+"):(\d+)(.\d+)?/', '\\1:"\\2\\3"', $json); 
+0

Merci! Cela a coupé pour moi! Ce problème devrait être corrigé bientôt sur le côté de Facebook cependant: https://developers.facebook.com/bugs/254502934666393 –

+0

Ce modèle fonctionnera également puisqu'il fait correspondre les chiffres et les points dans un groupe de capture: 'preg_replace ('/ (" [\ w.] + "): ([\ d.] +)/',' \\ 1:" \\ 2 "', $ json);' – bejonbee

0

Ce (preg_replace('/("\w+"):(\d+)(.\d+)?/', '\\1:"\\2\\3"', $json);) a fonctionné pour moi (pour résultat de l'analyse syntaxique facebook api)