I'm using FQL to retrieve a list of users from Facebook. For consistency I get the result as JSON. This causes a problem - since the returned JSON encodes the user IDs as numbers, json_decode() converts these numbers to floating point values, because some are too big to fit in an int; of course, I need these IDs as strings.
Since json_decode() does its own thing without accepting any behavior flags, I'm at a loss. Any suggestions on how to resolve this?
I use this and it works almost great.
The json breaks when there is geo data included, eg.
{"lat":54.2341}
results in"lat":"54".2341
Solution:
Quick and dirty, seems to work for now :
I've resolved the issue by adding
&format=json-strings
to my the FQL api call, like so:This tells facebook to wrap all the numbers in quotes, which leads json_decode to use neither int-s not floats.
Because I was afraid this issue is not restricted to FQL but to all graph API calls that choose to represent some of the IDs as BIG-INTs I've went as far as patching facebook's PHP SDK a bit to force Facebook to return all of its numbers as strings.
I've added this one line to the
_graph
function. This would be line 738 in facebook_base.php, version 3.1.1Sure fix
This
(preg_replace('/("\w+"):(\d+)(.\d+)?/', '\\1:"\\2\\3"', $json);)
worked for me (for parsing result from facebook api)I had a similar problem where
json_decode
was converting recent twitter/tweet IDs into exponential numbers.Björn's answer is great if you want your BIGINT to become a string - and have PHP 5.3+. If neither of those things are true, another option is to up PHP's float precision. This can be done a different few ways...
precision
value in your php.ini and change it toprecision = 20
ini_set('precision', 20);
to your PHP appphp_value precision 20
to your app's .htaccess or virtual host filejson_decode() can convert large integers to strings, if you specify a flag in the function call: