2009-11-24 89 views
4

我正在使用PHP(5.3.1)的一個項目,我需要發送一個JSON字符串到一個web服務(在python中),但是我從json_encode得到的結果沒有作爲有效JSON(我使用JSLint檢查有效性)。我應該補充一點,我試圖編碼的結構相當大(13K編碼),並且部分由UTF8數據組成,而json_encode處理它時,我在結果中的奇怪位置得到空格。例如,我可以得到{「hello」:tru e}或{「hell o」:true},由於JSON無效(或第二個示例中的數據),導致web服務發生錯誤。無效的PHP JSON編碼

我也嘗試過使用Zend框架進行JSON編碼,但這並沒有太大的區別。

在PHP中有JSON的已知問題嗎?有沒有人遇到過這種行爲並找到了解決方案?

回答

3

我正在處理一些自動生成的電子郵件有一天,發現同樣怪異的行爲(空格插入到郵件正文),所以我開始檢查電子郵件後,找到了罪魁禍首:

從SMTP RFC2821:

文本 線包括爲1000個 字符(不計算領先 點複製透明度)的最大總長度。

我的電子郵件正文確實在一行中,因此\ n修正了空格問題。

6

確保對象鍵不能包含空格或任何非Unicode字符,未加引號的變量只能是布爾型,整數型,浮點型,對象型和數組值,應始終引用字符串。

另外,我建議你在你的json輸出之前添加正確的標題。

if(!headers_sent()) 
    header('Content-Type: application/json; charset=utf-8', true,200); 

你還可以發佈你的數組或對象,你傳遞給json_encode

6

您聲明「我試圖編碼的結構...部分由UTF8數據組成。」這意味着它也是部分非UTF8數據。該json_encode doc有在底部的評論,即

json_encode()將字符串編碼爲UTF8格式,而默認情況下PHP的字符串是ISO-8859-1編碼。 這意味着,

json_encode(array('àü'));

會產生一個空字符串的JSON表示,而

json_encode(陣列(函數utf8_encode( 'AU')));

將工作。

是否由於非UTF8輸入而導致JSON的失敗段?

+0

實際上,我確實嘗試在json編碼之前對我的所有內容進行編碼,但是這也不起作用 – Ofir 2009-11-25 09:19:47

+0

失敗並不直接與UTF-8鏈接。我可以得到一個布爾值,其中有一個空格或類似的東西(tru e而不是true) – Ofir 2009-11-25 09:42:31

1

經過近一天的研究,我發現問題不在json_encode函數中。這是我的職位功能。

基本上,json_encode準備將數據發送到另一個服務。在今天之前,我已經使用stream_context_create和fopen將數據發佈到外部服務,但現在我使用fsockopen和fputs,它似乎正在工作。

雖然我不確定到問題的本質,我很高興現在的工作:)

BTW:在這個過程之後,我自己郵寄的輸入和輸出(無論是在JSON),這是我首先看到了問題。這個問題仍然存在,但我想這與郵件的編碼或類似的東西有關。