Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中处理FQL返回的大用户ID_Php_Json_Facebook_Facebook Fql - Fatal编程技术网

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

在PHP中处理FQL返回的大用户ID,php,json,facebook,facebook-fql,Php,Json,Facebook,Facebook Fql,我正在使用FQL从Facebook检索用户列表。为了保持一致性,我得到的结果是JSON。这导致了一个问题——由于返回的JSON将用户ID编码为数字,JSON_decode()将这些数字转换为浮点值,因为有些数字太大,无法放入整数中;当然,我需要这些ID作为字符串 由于json_decode()在不接受任何行为标志的情况下完成了自己的工作,所以我不知所措。关于如何解决这一问题,有什么建议吗?快速而肮脏,目前看来有效: $sJSON = preg_replace('/:(\d+)/', ':"${1

我正在使用FQL从Facebook检索用户列表。为了保持一致性,我得到的结果是JSON。这导致了一个问题——由于返回的JSON将用户ID编码为数字,JSON_decode()将这些数字转换为浮点值,因为有些数字太大,无法放入整数中;当然,我需要这些ID作为字符串


由于json_decode()在不接受任何行为标志的情况下完成了自己的工作,所以我不知所措。关于如何解决这一问题,有什么建议吗?

快速而肮脏,目前看来有效:

$sJSON = preg_replace('/:(\d+)/', ':"${1}"', $sJSON);
如果在函数调用中指定标志,则可以将大整数转换为字符串:

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

我遇到了一个类似的问题,
json_decode
将最近的twitter/tweet ID转换成指数数字

如果您希望BIGINT成为字符串,并且使用PHP5.3+,那么Björn的答案非常好。如果这两种情况都不正确,另一种选择是提高PHP的浮点精度。 这可以通过几种不同的方式来实现

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

我通过在FQL api调用中添加
&format=json字符串
解决了这个问题,如下所示:

$myQuery = "SELECT uid2 FROM friend WHERE uid1=me()";
$facebook->api("/fql?q=" . urlencode($myQuery) . "&format=json-strings")
这告诉facebook将所有数字都用引号括起来,这导致json_decode两者都不使用 int-s不浮动

因为我担心这个问题不局限于FQL,而是所有选择将某些ID表示为大整数的graph API调用,所以我甚至对facebook的PHP SDK进行了一些修补,以迫使facebook将其所有数字作为字符串返回

我已将这一行添加到
\u graph
函数中。 这将是facebook_base.php版本3.1.1中的第738行


当然修复了,我用了这个,效果几乎很好

json_decode(preg_replace('/("\w+"):(\d+)/', '\\1:"\\2"', $jsonString), true)
当包含地理数据时,json会中断,例如,
{“lat”:54.2341}
导致
“lat”:“54.2341

解决方案:

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

这个
(preg_replace('/(“\w+”):(\d+)(.\d+)/,'\\1:\\2\\3',$json)
对我很有效(用于解析facebook api的结果)

PHP方面的一个主要疏忽是浏览器不会阻塞以BigInt(64位)开头的整数,而不是以BigInt(53位)开头的整数。在JSON不支持的情况下,将BigInt引入现代浏览器并没有多大帮助。所以我正试图纠正这一点

我的方法是处理解码的数组(在可能将其重新编码为字符串之前):

函数fix\u large\u int(&$value)
{
如果(is_int($value)&&$value>9007199254740991)
$value=strval($value);
}
$json_arr=json_decode($json_str,标志:json_BIGINT_AS_STRING | json_OBJECT_AS_ARRAY);
echo('before:'.json_encode($json_arr)。'
'.PHP_EOL); 数组_walk_recursive($json_arr,'fix_large_int'); echo('after:'.json_encode($json_arr)。'
'.PHP_EOL);
数字9007199254740991是JavaScript的number.MAX_SAFE_整数值。请在此处阅读:


(顺便说一句,我之所以来到这里,是因为Twitter API的
stringify_ids
参数对于
blocks/ids
friends/ids
不适用于我。不过,在我能找到的任何地方似乎都没有提到这一点。)

我不知道我怎么会在文档中遗漏它。谢谢这只是在PHP的开发版本中-至少根据PHP.net?@Sebastian Hoitz上的文档,页面已经很久没有更新了,根据它的说法,参数应该可以从PHP5.3(很久以前发布)中获得.我刚刚在本地计算机上尝试了一下,但出现了一个错误,json_decode只接受3个参数。实际上,json_BIGINT_AS_字符串是根据文档提供的。对于早期版本,preg_replace解决方案可能最有效,如下所述-我会做一些类似于
json_解码的事情(preg_replace('/(“\w+”):(\d+/”,'\\1:'\\2',$jsonString),true)
这适用于我们这些不使用最新PHP,因此没有json_BIGINT作为字符串的人。这是我最可靠的答案。以防万一您以后偶然发现:$myQuery=$facebook->api(“/fql”,array(“q”=>“从朋友那里选择uid2,其中uid1=me(),“format”=>“json字符串”);谢谢那是给我剪的!不过,Facebook方面应该很快就能解决这个问题:这种模式也会起作用,因为它匹配一个捕获组中的数字和点:
preg_replace('/(“[\w.]+”):([\d.]+)/','\\1:“\\2”,$json)简单易用。顺便说一句,我们可以调整数字'20'以适应长值吗?我将这一行添加到我的.htaccess php_值精度20中。在第一个站点上,这很好。但是当我在另一个站点上添加这个时,我得到了500个内部服务器错误。我应该用什么替代品?
$json = preg_replace('/("\w+"):(\d+)(.\d+)?/', '\\1:"\\2\\3"', $json);