2014-09-29 181 views
2

我的應用程序的一個組成部分看起來測試字符串可以被解碼,如果是的話,它會以解碼值的變量:json_decode是重整字符串,而不是返回null

if (json_decode($value, true)) { 
    $value = json_decode($value, true); 
} 

在我的一臺服務器,如果我傳入字符串「123-555-6789」,它會將其解析爲有效的json,但它只返回字符串「123」。如果電話號碼用句點字符分隔:「123.555.6789」json_decode將返回「123.555」。即使這樣做,json_last_error告訴我沒有錯誤。

我想這是一個錯誤,因爲這個問題的服務器運行較老的PHP。但後來我對它進行了更新,以便它與返回正確值(NULL)的服務器的版本相同。它沒有解決問題。帶有PHP版本5.5.12的服務器正常工作。具有php 5.2的服務器現在具有5.5.17的值。給出預期輸出的服務器是windows,破壞的是ubuntu。雖然我不認爲這會有所作爲。

是否有在php.ini中的配置設置或我應該關閉的東西會改變這一點?如:fundamentally_break_json = 1

+0

這聽起來更像是你有[type juggling](http://php.net/manual/en/language.types.type-juggling.php)問題。 – 2014-09-29 16:41:22

+0

不能複製5.5.17:http://codepad.viper-7.com/YAMWMG – 2014-09-29 16:53:46

+0

@Jason McCreary我認爲你是對的。 $ n =(int)「123-555-6789」返回$ n == 123。但問題依然存在。爲什麼這隻發生在我的一臺服務器上?我如何解決它? – Shane 2014-09-29 18:10:03

回答

0

其實我相信UBUNTU的實現是正確的。 json_decode讓你知道字符串中出現語法錯誤的位置。你應該檢查的是json_last_error(),它將返回JSON_ERROR_SYNTAX讓你知道字符串格式不正確。

如果json_last_error()== JSON_ERROR_NONE,那麼你應該可以自由設置你的$值。

+0

即使它不工作(打破電話號碼)的json_last_error()== JSON_ERROR_NONE。它說沒有錯誤,我會加上這個問題。 – Shane 2014-09-29 18:01:40

+0

這是肯定不正確。根據文檔,它應該返回一個有效的對象或數組,或者爲null。 – Shane 2014-09-29 18:05:59