PHP中的JSON编码无符号64位整数

时间:2017-06-06 07:15:52

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

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

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

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

当我调用PDO::ATTR_STRINGIFY_FETCHES函数时,相关字段会得到相同的处理:当它们超过63位宽时,它们就成了字符串。

我不想把它们留在json输出中作为字符串,因为它需要"破坏"更改客户端代码以使它们在解码时处理json-string到ulong转换。

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

我已经看过JsonSerializable,但它似乎无法解决我的问题。

1 个答案:

答案 0 :(得分:1)

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

我在我的项目中包含了一个在GitHub here上找到的自定义纯PHP json编码库。

我已经宣布了这个界面:

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编码将它们作为数字传递给它们。