处理PHP中FQL返回的大用户ID

gga*_*ett 19 php json facebook facebook-fql

我正在使用FQL从Facebook检索用户列表.为了保持一致性,我将结果作为JSON.这会导致问题 - 因为返回的JSON将用户ID编码为数字,json_decode()会将这些数字转换为浮点值,因为有些数字太大而无法放入int中; 当然,我需要这些ID作为字符串.

由于json_decode()在没有接受任何行为标志的情况下做了自己的事情,所以我很茫然.有关如何解决此问题的任何建议?

Bjö*_*örn 28

如果在函数调用中指定了一个标志,json_decode()可以将大整数转换为字符串:

$array = json_decode($json, true, 512, JSON_BIGINT_AS_STRING)
Run Code Online (Sandbox Code Playgroud)

  • 实际上,根据文档,JSON_BIGINT_AS_STRING [仅在5.4以后可用](http://au2.php.net/manual/en/json.constants.php).对于早期版本,preg_replace解决方案可能效果最好,如下所述 - 我会做类似`json_decode(preg_replace('/("\ w +"):(\d +)/','\\ 1:"\\ 2 "',$ jsonString),true)` (14认同)

小智 20

我通过添加&format=json-strings到我的FQL api调用解决了这个问题,如下所示:

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

这告诉facebook将所有数字包装在引号中,这导致json_decode既不使用int -s也不使用浮点数.

因为我担心这个问题不仅限于FQL,而是所有图形API调用都选择将一些ID表示为BIG-INTs,我已经修改了facebook的PHP SDK,以迫使Facebook返回其全部数字作为字符串.

我已将这一行添加到该_graph函数中. 这将是facebook_base.php版本3.1.1中的第738行

$params['format'] = 'json-strings';
Run Code Online (Sandbox Code Playgroud)

当然可以解决


bro*_*oox 8

我有一个类似的问题,json_decode即将最近的推特/推特ID转换为指数数字.

如果你希望你的BIGINT成为一个字符串 - 并且拥有PHP 5.3+,Björn的答案很棒.如果这些都不是真的,另一种选择是提高PHP的浮点精度.这可以通过不同的方式完成......

  • precision在php.ini中找到值并将其更改为precision = 20
  • 添加ini_set('precision', 20);到您的PHP应用程序
  • 添加php_value precision 20到您应用的.htaccess或虚拟主机文件


gga*_*ett 5

快速和肮脏,似乎现在工作:

$sJSON = preg_replace('/:(\d+)/', ':"${1}"', $sJSON);
Run Code Online (Sandbox Code Playgroud)