【问题标题】:JSON encoding unsigned 64 bit integers in PHPPHP中的JSON编码无符号64位整数
【发布时间】:2017-11-07 02:13:49
【问题描述】:

我知道 PHP 不支持无符号 64 位整数。

但是我只需要通过 PDO 查询从 MySQL 表中读取无符号的 64 位整数值,并将它们传递给客户端(不执行任何计算或比较); PHP 页面正在向客户端发布一个非常简单的 REST 接口,并且应该仅将查询结果输出为 JSON 数据。

现在 PDO 查询返回未触及的整数,只要它们是 63 位宽(无符号),但是当表中的原始值设置了第 64 位时,PDO 驱动程序将其转换为字符串(我设置了@ 987654324@ 属性为 false,因为我希望尽可能保留类型)。

当我调用json_encode()函数时,相关字段得到相同的处理:当它们超过63位宽度时它们变成字符串。

我不想将它们作为字符串留在 json 输出中,因为它需要对客户端代码进行“破坏性”更改才能让它们在解码时处理 json-string 到 ulong 的转换。

有没有办法以某种方式自定义 json_encode 行为以将它们输出为“UInt64”?

我查看了 JsonSerializable,但它似乎无法解决我的问题。

【问题讨论】:

  • 您可以使用数学扩展来支持 PHP 中的无符号 64 位整数,如果它不支持:php.net/manual/en/intro.gmp.php(这是一条评论,因为它不是您问题的答案)。对您的问题:是的,您可以自定义 json 编码,请参阅:php.net/manual/en/class.jsonserializable.php
  • @KIKOSoftware 我不认为 jsonSerializable 是一个解决方案:这个类只允许您选择必须序列化的内容,而不是如何。
  • 好吧,看来我必须编写自己的 json 编码器了。我希望我能避免这种情况。来吧,2017 年的语言怎么可能没有内置对无符号 64 位整数的支持????

标签: php json encoding 64-bit unsigned-integer


【解决方案1】:

我找到了解决该问题的方法,不完全是“优雅”,而是实用(并且有效)。

我在我的项目中包含了一个自定义的纯 PHP json 编码库,该库位于 GitHub here

我已经声明了这个接口:

interface JSONSerializer
{
    public function toJSON();
}

我已经在这个简单的类中实现了接口:

class UInt64Raw implements JSONSerializer {

    private $value;

    public function __construct($number) {
        $this->value = $number;
    }

    public function getValue() { return $this->value; }


    public function toJSON() {
        if (is_null($this->value)) return "null";
        if ($this->value) return (string)$this->value;
        return "0";
    }

} 

我稍微更改了 JSON 编码器库的默认行为,以便在要编码的对象实现该接口时调用接口方法。

然后,我可以从 PDO 检索无符号 64 位整数作为字符串,将它们包装在 UInt64Raw 对象实例中,并最终通过自定义 JSON 编码将它们不带引号(作为数字)传递。

【讨论】:

    猜你喜欢
    • 2012-02-11
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多