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

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

问题描述:

我知道PHP不支持无符号64位整数。JSON编码无符号64位整数在PHP中

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

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

当我打电话json_encode()功能,在相关领域得到同样的待遇:他们成为字符串时,他们超过63位的宽度。

我不想让他们在JSON字符串输出,因为它需要“破”,在客户端代码的变化,让他们在解码处理JSON字符串到ulong的转换。

有没有办法以某种方式定制json_encode行为以将它们作为“UINT64”?

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

+0

你可以使用一个数学扩展到支持无符号64个整数在PHP中,如果没有:http://php.net/manual/en/intro.gmp.php(这是一条评论,因为这是不是你的问题的答案)。至于你的问题:是的,你可以自定义json编码,请参阅:http://php.net/manual/en/class.jsonserializable.php –

+0

检查此答案https:// *。 com/questions/30589965/json-decode-and-json-encode-long-integers-without-loosing-data – Eimsas

+0

@KIKOSoftware我不认为jsonSerializable是一个解决方案:这个类只允许你选择必须序列化的东西,而不是如何。 –

我发现问题的解决方法,不完全“优雅”,但实际(它的工作原理)。

我已经包括在我的项目在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编码。