2012-01-25 20 views
4

我有一個使用Android編寫的客戶端/服務器應用程序,我使用與android捆綁的標準org.json包類來進行解析和創建。Json.org Android添加怪異字符

我已經得到的權利在例如產生的JSON字符串中間出現在服務器端怪異字符(不完整的一個,因爲它的大):

{!lo":"es_MX","id":2791884,"os":"8"} 

正如你所看到的(!)感嘆號隨機出現,而不是雙引號。我還得到其他隨機字符出現在中間字符串。這是非常奇怪的。

下面是在這個確切位置它創建JSON對象的代碼...

JSONObject jsonObject = new JSONObject(); 
jsonObject.put("key", someValue); 

這裏爲發送該代碼..

HttpPost type = new HttpPost(<server url here>); 
List<NameValuePair> params = new ArrayList<NameValuePair>(); 
params.add(new BasicNameValuePair("v", jsonObject.toString())); 
type.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 
httpClient.execute(type); // This is a DefaultHttpClient 

我說隨機的,而是感嘆號在許多錯誤中是一致的,但不是每次都是一致的。大約有5條消息出現這種錯誤,每天有數萬條消息。通常不是插入到json中的值的內容,而是定義消息結構的字符(例如上面的引號字符),這暗示了這不是字符集問題。

有沒有人遇到過這個?

+2

您可以發佈生成JSON的代碼嗎? –

+0

您能否確認從服務器端JSON字符串按照JSON規定以良好格式構建? – MKJParekh

+0

這幾乎可以肯定是一個字符集和/或編碼問題。您需要確保您的內容編碼和字符集在客戶端,服務器和傳輸過程中是相同的。 – Jonathan

回答

-1

在將客戶端發送到服務器之前,在客戶端上打印json(使用Log.d或類似的命令)並查看它是否包含奇怪的字符。

+0

我需要找到根本原因並解決方案,而不是解決方法。如果字符串確實包含奇怪的字符,那我該怎麼辦? –

0

看起來你是用其他格式編寫字符串,並且接收另一種格式的文本解碼 ,比如iso to utf。

0

看起來您的發件人沒有正確設置character set。西班牙將在常規的ASCII或大多數Windows編碼不存在的符號,你需要使用UTF-8:

Content-Type: text/html; charset=utf-8

不知道該HTTP交換你使用(read more),這是不可能給你需要一個確切的代碼片段來解決這個問題 - 但這應該很容易弄清楚。

+0

我可以確認我已經爲請求指定了UTF-8。見上面修改的問題。 –

+0

@Amorgos :(在這裏猜測)你確定你將* HTTP請求*字符集設置爲UTF-8而不僅僅是表單內容嗎?如果您可以在這裏發佈原始HTTP請求文本,這將有所幫助。 –

0

您提供的信息不足。激進的方法來解決你的問題,只是替換所有(!)字符(「)。

string.replaceAll("!", "\""); 

我想這是服務器端的問題。

+0

潛在的解決方法,但超hacky! –

+0

根本法^) –

0

我也有simmilar問題。讓我寫得多描述我的環境,我的服務器是以json格式返回數據,但是我的問題是與特殊字符連接,如ąść.YOu應該知道,json_encode()將從服務器返回,在這種情況下字符串文本爲null 我知道,它很爛!在我選擇數據庫之前,我添加了mysql_query('SET CHARACTER SET utf8');,這使我可以從服務器中取出字符串,並使用特殊的變音符號。

現在在應用程序網站上,我通過GET方法從服務器獲取數據。首先我將結果數據存儲到InputStream。然後我將它打包到InputStreamReader中並逐字節地將它附加到stringBuilder中。準備好的附加文本正在由toString()準備好的字符串轉換。然後我把它放到new JsonArray(readyString)。不過,我發現json的一些文本部分有奇怪的字符。尤其是在那些特殊字母如żóć的地方。例如"description":"aaa"正在拋出「descriptionPffa」:「aa」null:`。

我決定嘗試另一種方式來轉換數據結果。在我從服務器轉換數據的地方,我使用了下面的方法。最後,wgen我得到了byteArrayOutputStream對象,我將其更改爲new String(byteArray),然後以某種方式與new JsonArray(new String(byteArray))一起工作!

public class Streams { 
    public static byte[] getBytes(InputStream is) { 
     int len; 
     int size = 1024; 
     byte[] buf = new byte[0]; 

     try { 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      buf = new byte[size]; 
      while ((len = is.read(buf, 0, size)) != -1) 
       bos.write(buf, 0, len); 
      buf = bos.toByteArray(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return buf; 
    } 
}