2017-06-06 59 views
0

我知道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:// stackoverflow。 com/questions/30589965/json-decode-and-json-encode-long-integers-without-loosing-data – Eimsas

+0

@KIKOSoftware我不認爲jsonSerializable是一個解決方案:這個類只允許你選擇必須序列化的東西,而不是如何。 –

回答

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編碼。

相關問題