Android - how to parse JsonArray from string?

android, json

Solution

Hi @Caerulius, Harish, ρяσѕρєя K, Hot Licks , and all. Finally, after 2 days of headache and 2 sleepless nights, I solved the issue. And because you spend your valued time to discuss with me, I see that I have to tell you the root cause. That's my responsibility.

First of all, I am a senior android developer. So, I at least know about JSON basic, I know how to parse data from JSON string, and I know many useful online tools to validate it. I confirm that the JSON string I got from server is valid.

As I told in my question, I used `final String result = EntityUtils.toString(entity);` to get JSON string from `HttpEntity` object. I have used this many times in the past and it worked. No problem. But, in this case, it's not. The original JSON string like this:

   [{
      "LotPrizes":[
         {
            "Prize":"Giảitám",
            "Range":"50"
         },
         {
            "Prize":"Giảibảy",
            "Range":"264"
         },
         ...
    }]

But what I got like this:

"[{
      \"LotPrizes\":[
         {
            \"Prize":\"Giảitám\",
            \"Range\":\"50\"
         },
         {
            \"Prize\":\"Giảibảy\",
            \"Range\":\"264\"
         },
         ...
    }]"

This string is similar with the constant string which we may declare as below:

String stringVariable = "\"[{
          \\\"LotPrizes\\\":[
             {
                \\\"Prize":\\\"Giảitám\\\",
                \\\"Range\\\":\\\"50\\\"
             },
             {
                \\\"Prize\\\":\\\"Giảibảy\\\",
                \\\"Range\\\":\\\"264\\\"
             },
             ...
        }]\" ;

It's a valid string, but not a valid JSON String.

To fix this issue, I change the way to get JSON string, and remove unnecessary characters like this:

                            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 contain JSON string which I can parse correctly. I think this should a bug of HttpEntity library.

Hope this helps some other guys.

Problem

I am trying to parse a json array from json string but it always throws the exception `data of type java.lang.String cannot be converted to JSONArray`. Please tell me if I make any mistake. Thanks. Here is my codes to get Json from server: ``` try { String url = String.format(<url here>, province.provinceCode2); HttpClient httpClient = getHttpClient(); HttpGet httpGet = new HttpGet(url); HttpResponse httpResponse = httpClient.execute(httpGet); HttpEntity entity = httpResponse.getEntity(); final String result = EntityUtils.toString(entity); parseAndSaveJsonData(province, result); } catch (Exception e) { e.printStackTrace(); } ``` here is codes to parse JsonArray: ``` String jsonString = <below json string> JSONArray ja = new JSONArray(jsonString); ``` Here is my json string: ``` [ { "LotPrizes":[ { "Prize":"Giảitám", "Range":"50" }, { "Prize":"Giảibảy", "Range":"264" }, { "Prize":"Giảisáu", "Range":"3654-5162-3097" }, { "Prize":"Giảinăm", "Range":"9739" }, { "Prize":"Giảitư", "Range":"97690-99274-32442-69432-04855-10132-17085" }, { "Prize":"Giảiba", "Range":"73745-13007" }, { "Prize":"Giảinhì", "Range":"05521" }, { "Prize":"Giảinhất", "Range":"74870" }, { "Prize":"GiảiDB6", "Range":"878833" } ] }, { "LotPrizes":[ { "Prize":"Giảitám", "Range":"50" }, { "Prize":"Giảibảy", "Range":"264" }, { "Prize":"Giảisáu", "Range":"3654-5162-3097" }, { "Prize":"Giảinăm", "Range":"9739" }, { "Prize":"Giảitư", "Range":"97690-99274-32442-69432-04855-10132-17085" }, { "Prize":"Giảiba", "Range":"73745-13007" }, { "Prize":"Giảinhì", "Range":"05521" }, { "Prize":"Giảinhất", "Range":"74870" }, { "Prize":"GiảiDB6", "Range":"878833" } ] } ] ```

Original source