9

I have to parse the below nested Json array's data into my application. I am confused how to get the values out of it.

  {
            "prodCat_list": [
                {
                    "prods": [
                        {
                            "cat_id": "9",
                            "position": "1",
                            "sku": "wwww345"

                        },
                        {
                            "cat_id": "9",
                            "position": "2",
                            "sku": "coof23"

                        },
                        {
                            "cat_id": "9",
                            "position": "3",
                            "sku": "dde45"

                        },
                        {
                            "cat_id": "9",
                            "position": "4",
                            "sku": "5555"

                        }
             ]
                },
{
                    "prods": [
                        {
                            "cat_id": "9",
                            "position": "1",
                            "sku": "wwww345"

                        },
                        {
                            "cat_id": "9",
                            "position": "2",
                            "sku": "coof23"

                        },
                        {
                            "cat_id": "9",
                            "position": "3",
                            "sku": "dde45"

                        },
                        {
                            "cat_id": "9",
                            "position": "4",
                            "sku": "5555"

                        }
             ]
                },
            ]
        }

Can anyone please guide me how to get the inside values from that.

I have tried this

JSONParser parser = new JSONParser();
        JSONObject items = parser.getJSONFromUrl(productInfoUrl);
        try {
            JSONArray itemsDetails = items.getJSONArray("prodCat_list");
            if(itemsDetails.length()>0){

                for (int i = 0; i < itemsDetails.length(); i++) {
                    JSONArray productWithCategories = itemsDetails.getJSONArray(i);
                    JSONObject object = productWithCategories.getJSONObject(i);

                    Product productInfo = new Product( object.getString("sku"), object.getInt("cat_id"), object.getInt("position"));
                    ProductDbHandler productDbHandler = new ProductDbHandler(context);
                    productDbHandler.addProducts(productInfo);
                }
            }
            else 
                System.out.println("No product to add");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
6
  • @Enrichman ok i will show you. Commented Jul 16, 2013 at 9:41
  • 2
    Btw, that json is not valid. The last item in the inner object ends with a comma: "sku": "5555", Commented Jul 16, 2013 at 9:45
  • @Enrichman i have added the tried code. Also i have removed that comma Commented Jul 16, 2013 at 9:47
  • Still not valid. You have a comma at the end of your object. use jsonlint.com to check your json. And check in the logcat for any errors. Commented Jul 16, 2013 at 10:17
  • There is another comma(,) (3rd line from last) in your json, remove it and try again.. Commented Jul 16, 2013 at 10:18

6 Answers 6

24

Here is how I think your JSON Parser should look like (there can be some typo mistakes,I didn't test this code on editor : )) :

JSONObject mainObj = new JSONOBject(myString);
if(mainObj != null){
    JSONArray list = mainObj.getJSONArray("prodCat_list");
    if(list != null){
        for(int i = 0; i < list.length();i++){
            JSONObject elem = list.getJSONObject(i);
            if(elem != null){
                JSONArray prods = elem.getJSONArray("prods");
                if(prods != null){
                    for(int j = 0; j < prods.length();j++){
                        JSONObject innerElem = prods.getJSONObject(j);
                        if(innerElem != null){
                            int cat_id = innerELem.getInt("cat_id");
                            int pos = innerElem.getInt("position");
                            String sku = innerElem.getString("sku");
                        }
                    }
                }
            }
        }
    }
}
Sign up to request clarification or add additional context in comments.

5 Comments

Nice one.. it helped me too ..thanks for the answer .. :)..I had a question though..is this the best way to parse nested arrays/objects ?
It depends a lot of your JSON string, but in my opinion, this is the best solution which I know.
You can automatically parse it with Gson library from Google. See my answer below stackoverflow.com/a/37585670/3387187
@hardartcore I did the same. As per the question I have 10 prods array and each having five elements. I am checking a condition on the innerElem and setText to a inflated View according to that. The problem is that all the 10 arrays are running at the same time and 10 views inflated on the screen. I want them to run one by one.
1

You can use the GSon library. It parses the json into various objects that you can access. A dummy Code is here:

` GSon gSon  = new GSon();
  ProdCatList prodCatList = gSon.fromJson(---inputStreamReader of your JSon data---,ProdCatList.class);`

Comments

1

Try this!

//Write your own implementation of json parser
JSONParser jParser = new JSONParser();
JSONArray prod_cat = new JSONArray();
JSONArray products = new JSONArray();
JSONObject json = jParser.getJSONFromUrl("your source");
prod_cat = json.getJSONArray("prodCat_list");
for (int i = 0; i < prod_cat.length(); i++) {
        JSONObject object = prod_cat.getJSONObject(i);
        products = object.getJSONArray("products");
}

Comments

1

try to use

org.json.simple.JSONValue

code:

import org.json.simple.JSONValue;
String content = "{...}";
JSONValue.parse(content);

Comments

0

JSONObject reader = new JSONObject(results);

            JSONArray VendorProductsList = reader.getJSONArray("VendorProductsList");
            for (int i = 0; i < VendorProductsList.length(); i++) {
                ebay=new Ebay();
                JSONObject elem = VendorProductsList.getJSONObject(i);
                JSONArray Products = elem.getJSONArray("Products");

                for (int j = 0; j < Products.length(); j++) {
                    JSONObject innerElem = Products.getJSONObject(j);
                   //JSONObject ProductName=Products.getJSONObject(j);
                  ebay.setProductName(innerElem.getString("ProductName"));
                    gallery_array.add(ebay);

Comments

0

Simply you can automatically parse it with Gson:

JSONParser parser = new JSONParser();
JSONObject items = parser.getJSONFromUrl(productInfoUrl);
Gson gson = new GsonBuilder().create();
ProdCatResponse prodCatResponse = gson.fromJson(items.toString(), ProdCatResponse.class);

But actually you can parse the JSON response in string form. You don't need to get the response in JSONObject and use toString().

JSONParser parser = new JSONParser();
String items = parser.getFromUrl(productInfoUrl);
Gson gson = new GsonBuilder().create();
ProdCatResponse prodCatResponse = gson.fromJson(items, ProdCatResponse.class);

More info about Gson: https://guides.codepath.com/android/Leveraging-the-Gson-Library


This is the model class sample, you can generate it with http://www.jsonschema2pojo.org.

ProdCatResponse.java

public class ProdCatResponse {

    private List <Prod> prods = new ArrayList <Prod> ();

    public List <Prod> getProds() {
        return prods;
    }

    public void setProds(List < Prod > prods) {
        this.prods = prods;
    }

}

Prod.java

public class Prod {

    private String catId;
    private String position;
    private String sku;

    public String getCatId() {
        return catId;
    }

    public void setCatId(String catId) {
        this.catId = catId;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }

    public String getSku() {
        return sku;
    }

    public void setSku(String sku) {
        this.sku = sku;
    }

}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.