2012-08-08 163 views
2

我正在編寫使用數據庫的PHP代碼。爲此,我使用一個數組作爲哈希映射。 每當從我的數據庫中添加或刪除內容時,我都會將其保存到文件中。PHP json_decode返回null

我被我的數據庫結構強制使用這種方法,不能使用mysql或任何其他標準數據庫(學校項目,所以結構保持不變)。

我建了兩個功能:

function saveDB($db){ 
    $json_db = json_encode($db); 
    file_put_contents("wordsDB.json", $json_db); 
} // saveDB 

function loadDB(){ 
    $json_db = file_get_contents("wordsDB.json"); 
    return json_decode($json_db, true); 
} // loadDB 

當回聲荷蘭國際集團的字符串編碼後,我得到或從文件加載後,我得到一個有效的JSON(測試了一個JSON觀衆)每當我試着使用json_decode()解碼字符串,我得到空(用var_dump()測試它)。

json字符串本身非常長(〜200,000個字符,這只是爲了測試)。

我試過如下:

  • 雙/單引號替換單/雙引號(沒有任何反斜槓,用一個反斜槓和三個反斜槓而任意組合,我可以用不同數量的想到。原始和替換字符串中的反斜槓),手動和使用str_replace()
  • 在json字符串之前和之後添加引號。
  • 更改頁面的編碼。
  • 解碼時不保存到文件(在編碼之後)。
  • 檢查斜槓和反斜槓。沒有被發現。
  • 嘗試addslashes()
  • 嘗試使用各種「Escape String」變體。

json_last_error()不起作用。我沒有得到錯誤號(獲得null,不是0)。

這不是我的服務器,所以我不確定使用什麼PHP版本,我不能升級/降級/安裝任何東西。

我相信尺寸與它有關,因爲小字符串似乎工作正常。

謝謝大家:)

+0

將你的實際文件壓縮後上傳到別處測試。否則這可能會成爲猜謎遊戲。 ||各種失敗原因包括UTF-8 BOM前綴,字符串中的所有無效字符集,或者僅僅是內存不足的錯誤 - 深度嵌套的PHP數組非常昂貴,並且'json_decode'本身在處理時保存了一些狀態數據。 ||否則嘗試一個不同的JSON庫; PEAR的Services_Json或upgradephp的up_json_decode。 – mario 2012-08-08 20:10:45

+0

你可以顯示'JSON'的輸出(也許在pastebin.com上),它不能與'json_decode'一起使用來測試嗎? – Kalpesh 2012-08-08 20:36:43

+0

我不確定是否可以使用其他json庫,因爲我無法控制服務器,也不知道那裏安裝了什麼。 該json可以在這裏找到: https://www.dropbox.com/s/t0nm040wjfgzq25/wordsDB.json – YMI 2012-08-09 16:11:57

回答

2

在您的JSON文件中將null更改爲「null」,它將解決問題。

+0

這解決了它。謝謝 :) – YMI 2012-08-15 17:25:42

3

檢查您的文件是否是UTF8編碼。 json_decode僅適用於UTF8編碼數據。

編輯: 當我看到上傳的JSON數據後,我做了一些挖掘,發現有'空'鍵。搜索:

「超越」:{ 「S01E01.html」:{ 「2217」:1}},:{ 「S01E01.html」:

變化是到是有效的財產名稱和json_decode將完成這項工作。

+0

有同樣的問題,它竟然是一個編碼問題。 – mAu 2012-08-08 20:19:14

+0

即使我沒有瀏覽文件(立即編碼和解碼),我也會得到null,並且解碼使用小jsons,所以我相信這個文件不是問題。 無論如何。 – YMI 2012-08-09 03:32:31

+0

任何方式來檢查什麼是遞歸限制? – YMI 2012-08-10 15:38:23

0

上週我有類似的問題。根據jsonlint.com,我的json是有效的。

我的json字符串包含一個#和一個&和這兩個使json_decode失敗並返回null。

通過使用var_dump(json_decode($ myvar)),它停止在哪裏失敗我設法弄清楚問題來自哪裏。

我建議var_dumping並使用find函數來尋找這些角色之王。

0

剛上關閉的機會..和更多的人打這個線程,而不是OP的問題......我錯過了之後,有人曾ヶ輛($ JSON)我上面方式調用堆棧。只要確保你沒有被同樣的東西咬傷並檢查html源代碼。

Kickself#124