Hi @Caerulius, Harish, ρσѕρє K, Hot Licks and all that. Finally, after two days of headache and two sleepless nights, I solved the problem. And since you spend your precious time discussing with me, I see that I have to tell you the root cause. That is my responsibility.
First of all, I am a senior Android developer. So, at least I know about JSON basic, I know how to parse data from a JSON string, and I know many useful online tools for checking it. I confirm that the JSON string received from the server is valid.
As I said in my question, I used final String result = EntityUtils.toString(entity); to get a JSON string from an HttpEntity object. I have used this many times in the past and it worked. No problems. But in this case it is not so. Original JSON String:
[{ "LotPrizes":[ { "Prize":"Giảitám", "Range":"50" }, { "Prize":"Giảibảy", "Range":"264" }, ... }]
But what I got:
"[{ \"LotPrizes\":[ { \"Prize":\"Giảitám\", \"Range\":\"50\" }, { \"Prize\":\"Giảibảy\", \"Range\":\"264\" }, ... }]"
This line is like a constant line, which we can declare below:
String stringVariable = "\"[{ \\\"LotPrizes\\\":[ { \\\"Prize":\\\"Giảitám\\\", \\\"Range\\\":\\\"50\\\" }, { \\\"Prize\\\":\\\"Giảibảy\\\", \\\"Range\\\":\\\"264\\\" }, ... }]\" ;
This is a valid string, but not a valid JSON string.
To fix this problem, I change the way I get the JSON string and delete the unnecessary characters as follows:
HttpClient httpClient = getHttpClient(); HttpGet httpGet = new HttpGet(url); HttpResponse httpResponse = httpClient.execute(httpGet); HttpEntity entity = httpResponse.getEntity(); InputStream is = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); String json = sb.toString(); json = json.replace("\\", ""); json = json.substring(1); json = json.substring(0, json.length() - 2);
Now the json variable contains a JSON string that I can parse correctly. I think this should be a HttpEntity library error.
Hope this helps some other guys.