Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android - how to parse JsonArray from string?

Tags:

json

android

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"
         }
      ]
      }

    ]
like image 392
Nguyen Minh Binh Avatar asked Jan 28 '13 16:01

Nguyen Minh Binh


People also ask

How do I read JSONArray?

String value = (String) jsonObject. get("key_name"); Just like other element retrieve the json array using the get() method into the JSONArray object.

Can we convert JSONArray to JSONObject?

We can also add a JSONArray to JSONObject. We need to add a few items to an ArrayList first and pass this list to the put() method of JSONArray class and finally add this array to JSONObject using the put() method.

What is JSON parsing in Android?

Advertisements. JSON stands for JavaScript Object Notation.It is an independent data exchange format and is the best alternative for XML. This chapter explains how to parse the JSON file and extract necessary information from it. Android provides four different classes to manipulate JSON data.


3 Answers

This is how to initialize a JSON parser:

JSONObject jsonObject = new JSONObject(jsonString);

That will give you the entire string as a Json Object. From there, pull out an individual array as a JsonArray, like this:

JSONArray jsonArray = jsonObject.getJSONArray("LotPrizes");

To access each "LotPrizes" you can use for loop logic:

for(int i=0;i<jsonArray.length();i++)
{
  JSONObject curr = jsonArray.getJSONObject(i);

  prize = curr.getString("Prize")

//Do stuff with the Prize String here
//Add it to a list, print it out, etc.
}

EDIT: Final code after your JSON edit:

JSONArray jsonArray = null;
String jsonString = <your string>
String currPrize = null;

JSONObject jsonObject = new JSONObject(jsonString);

jsonArray = jsonObject.getJSONArray("data");

for(int i=0;i<jsonArray.length();i++)
{
    JSONArray currLot = jsonArray.getJSONObject(i);

    for(int j=0; j<currLot.length();j++)
    {
        JSONobject curr = currLot.getJSONObject(j);

        currPrize = curr.getString("Prize");

        //Do something with Prize
    }
}

This code is functional and I'm using an almost identical version in my code. Hope this (finally) works for you.

like image 109
Caerulius Avatar answered Oct 19 '22 07:10

Caerulius


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.

like image 41
Nguyen Minh Binh Avatar answered Oct 19 '22 07:10

Nguyen Minh Binh


You can retrieve the jsondata from your string as follows ..

            JSONObject json = new JSONObject(jsonString);
            JSONArray jData = json.getJSONArray("data");
            for (int i = 0; i < jData.length(); i++) {
                JSONObject jo = jData.getJSONObject(i);

                JSONArray jLotPrizes = jo.getJSONArray("LotPrizes");
                for (int j = 0; j < jLotPrizes.length(); j++) {
                    JSONObject jobj = jLotPrizes.getJSONObject(j);

                    Log.i("Prize", "" + jobj.getString("Prize"));
                    Log.i("Range", "" + jobj.getString("Range"));
                }

            }
like image 41
Harish Avatar answered Oct 19 '22 07:10

Harish