最近我在使用Delphi編程時,遇到了一個棘手的問題:JSON返回亂碼。在此與大家分享一下,希望對遇到同樣問題的人有所幫助。
一開始我使用了TJSONObject類進行JSON的序列化和反序列化,但是當我在Delphi客戶端調用一個返回JSON字符串的接口時,結果發現返回的JSON字符串亂碼,而在網頁上使用相同的接口卻沒有這個問題。
var LResponse: IHTTPResponse; begin LResponse := LHTTP.Get('http://example.com/api'); Memo1.Lines.Add(LResponse.ContentAsString()); end;
經過一番排查,我發現問題并不在服務端,而是在客戶端解析JSON時出現了問題。相信很多人都知道,Delphi使用的是Unicode編碼(UTF-16),而JSON的默認編碼是Unicode(UTF-8)。這就導致了客戶端在解析JSON字符串時會出現亂碼。
為了解決這個問題,我們需要手動指定客戶端使用UTF-8編碼來解析JSON字符串。具體做法是在使用TJSONObject反序列化JSON字符串之前,先將JSON字符串轉換成UTF-8編碼的字節數組,然后再使用TJSONObject進行反序列化。
var LResponse: IHTTPResponse; LJSON: TJSONObject; LJSONBytes: TBytes; begin LResponse := LHTTP.Get('http://example.com/api'); LJSONBytes := TEncoding.UTF8.GetBytes(LResponse.ContentAsString()); LJSON := TJSONObject.ParseJSONValue(LJSONBytes, 0) as TJSONObject; end;
通過上述代碼,我們就可以順利地將UTF-8編碼的JSON字符串反序列化為Delphi的JSON對象了。如果你也在使用Delphi編程過程中遇到了JSON亂碼問題,可以嘗試一下上述方法解決。