【问题标题】:PHP json_decode on a 32bit server32位服务器上的PHP json_decode
【发布时间】:2010-12-19 03:24:16
【问题描述】:

我正在编写一个 twitter 混搭服务。当我收到 json 数据时,一些 twit id 大于 2147483647(这是 32 位服务器上允许的最大整数)。

我想出了一个可行的解决方案,即将整数转换为字符串;这样 json_decode() 函数在尝试生成数组时不会有任何问题。

这是我需要达到的目标:

之前(原始 JSON 数据)

[{"name":"john","id":5932725006},{"name":"max","id":4953467146}]

之后(已应用解决方案)

[{"name":"john","id":"5932725006"},{"name":"max","id":"4953467146"}]

我正在考虑一个 preg_match 实现,但我不知道如何做到防弹。任何帮助将不胜感激。

【问题讨论】:

    标签: php 32-bit json


    【解决方案1】:

    您可以使用preg_replace 捕获数字并添加引号,如下所示:

    $jsonString = '[{"name":"john","id":5932725006},{"name":"max","id":4953467146}]';
    
    echo preg_replace('/("\w+"):(\d+)/', '\\1:"\\2"', $jsonString);
    //prints [{"name":"john","id":"5932725006"},{"name":"max","id":"4953467146"}]
    

    试试上面的例子here。

    【讨论】:

    • 你肯定会想要"id": 在那个表达式中,确定吗?否则它将匹配任何数字序列,严重破坏任何包含数字的字符串。
    • 完全正确。它工作正常......但如果它只匹配“id”附近的数字会更好:
    • 事实上......如果有 "name":"junior2" 它会变成 "junior"2"" 你的代码:s
    • 是的,bobince 是对的。试试preg_replace('/"id":(\d+)/', '"id":"$1"', $jsonString)
    • 谢谢。我认为一些旧的 PHP 版本可能有这个问题,而新的则没有。因为我在一台机器上得到了一个工作的 json_decode,但至少在 php 5.2.3 的机器上没有。但上述解决方案有效!
    【解决方案2】:

    如果您使用 PHP 5.2,这些长 ID 将被解析为浮点数,虽然不理想,但至少可以为您提供另外 21 位的整数精度,这应该足以存储这些 ID。 (当然,64 位服务器是理想的。)

    【讨论】:

    • 运行它的服务器同时具有 php4 和 php5 环境。为了激活 php5,我必须在 .htaccess 文件中设置这个标志: AddType application/x-httpd-php5 .php 也许这个奇怪的设置不会让我获得 int2float 功能。不过感谢您提供的信息。
    • 应该可以,但是你可能仍然在运行旧版本的 PHP5。
    【解决方案3】:

    如果归根结底,您可以尝试使用big_int PECL 扩展。如果您需要,这让 PHP 可以使用非常大的数字。这是一个很大的飞跃,但如果您经常处理近乎麻木边缘的数字,您可能会发现它很有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 2018-04-22
      • 2010-09-16
      • 2016-10-28
      • 1970-01-01
      • 2012-09-18
      相关资源
      最近更新 更多