9

I have a JSON string coming from the server and it looks like this:

{
    "categories": {
        "0": {
            "term_id": "247",
            "name": "Content Curation"
        },
        "1": {
            "term_id": "50",
            "name": "Content Marketing"
        },
        "2": {
            "term_id": "2",
            "name": "Curation"
        },
        "3": {
            "term_id": "246",
            "name": "Inbound Marketing"
        },
        "4": {
            "term_id": "47",
            "name": "Marketing"
        },
        "5": {
            "term_id": "4",
            "name": "News Curation"
        },
        "6": {
            "term_id": "36",
            "name": "SEO"
        },
        "8": {
            "term_id": "248",
            "name": "Wordpress Content Curation"
        }
    }
}

My task is to get values of the "term_id" and "name" fields. I've used to get the "categories" object from current JSONObject by using this code:

JSONObject jObject = new JSONObject(responceData);
JSONObject categoryObject = jObject.getJSONObject("categories");
JSONArray  jarray = new JSONArray("["+categoryObject.toString().substring(1,categoryObject.toString().length() - 1) + "]");

for(int i=0;i<jarray.length();i++)
{
     JSONObject jobj = jarray.getJSONObject(i);
     String term_id=jobj.getString("term_id");
     String name=jobj.getString("name");
}

and the categoryObject looks like this:

{
    "0": {
        "term_id": "247",
        "name": "Content Curation"
    },
    "1": {
        "term_id": "50",
        "name": "Content Marketing"
    },
    "2": {
        "term_id": "2",
        "name": "Curation"
    },
    "3": {
        "term_id": "246",
        "name": "Inbound Marketing"
    },
    "4": {
        "term_id": "47",
        "name": "Marketing"
    },
    "5": {
        "term_id": "4",
        "name": "News Curation"
    },
    "6": {
        "term_id": "36",
        "name": "SEO"
    },
    "8": {
        "term_id": "248",
        "name": "Wordpress Content Curation"
    }
}

But after that I don't know how to get the fields. Is there any way to get all JSONObject children from the JSONObject?

If you have a source code or can give me an example please share it with me.

Floern
  • 33,559
  • 24
  • 104
  • 119
Arshak92
  • 634
  • 3
  • 10
  • 24

7 Answers7

22

here you can retrieve all your json data, ask for a specific key and innerKey to get what you want, cheers

    try
    {   
        String jsonString="";//your json string here
        JSONObject jObject= new JSONObject(jsonString).getJSONObject("categories");
        Iterator<String> keys = jObject.keys();
        while( keys.hasNext() )
        {
            String key = keys.next();
            Log.v("**********", "**********");
            Log.v("category key", key);
            JSONObject innerJObject = jObject.getJSONObject(key);
            Iterator<String> innerKeys = innerJObject.keys();
            while( innerKeys.hasNext() )
            {
                String innerKkey = keys.next();
                String value = innerJObject.getString(innerKkey);
                Log.v("key = "+key, "value = "+value);
            }
        }
    }
    catch (JSONException e)
    {   e.printStackTrace();    }
Ahmad Dwaik 'Warlock'
  • 5,953
  • 5
  • 34
  • 56
  • 1
    Thanks for the help. P.S. I've found a better solution by using your code. Please check my answer for details. – Arshak92 Mar 24 '14 at 10:51
  • While this may answer OPs question, this way has got great performance loopholes especially with large number of records. You can confirm from here https://www.mkyong.com/java/while-loop-for-loop-and-iterator-performance-test-java/ – Steve Kamau Oct 23 '16 at 08:10
  • please edit `String innerKkey = keys.next();` to `String innerKkey = innerKeys.next();` – Islam Ahmed Nov 09 '19 at 18:53
5

Check this answer , that way you don't need to know the keys, and can just loop through and access the inner object, but categories would be better as a JSONArray rather than an Object, that way you could just normally loop through

for(int i = 0; i < array.length(); i++) {
    JSONObject obj = myArray.get(i);
    ....
}
Community
  • 1
  • 1
TMH
  • 6,096
  • 7
  • 51
  • 88
4

Big thanks to Ahmad Dwaik and Tom Hart fot the answers. This is the code for solution.

try
        {   

            JSONObject jObject= new JSONObject(responseData).getJSONObject("categories");
            Iterator<String> keys = jObject.keys();
            while( keys.hasNext() )
            {
                String key = keys.next();
                Log.v("**********", "**********");
                Log.v("category key", key);
                JSONObject innerJObject = jObject.getJSONObject(key);

                String name = innerJObject.getString("name");
                String term_id = innerJObject.getString("term_id");

                Log.v("name = "+name, "term_id = "+term_id);

            }
        }
        catch (JSONException e){
           e.printStackTrace();    
        }
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
Arshak92
  • 634
  • 3
  • 10
  • 24
2

Use the keys() iterator to iterate over all the properties, and call get() for each.

Iterator<String> iter = json.keys();
while (iter.hasNext()) {
    String key = iter.next();
    try {
        Object value = json.get(key);
    } catch (JSONException e) {
        // Something went wrong!
    }
}

See this : https://stackoverflow.com/a/13573965/2480911

Community
  • 1
  • 1
kaushik parmar
  • 805
  • 6
  • 19
1

try this

JSONObject jObject = new JSONObject(responceData);
JSONObject categoryObject = jObject.getJSONObject("categories");
JSONObject obj0 = categoryObject.getJSONObject("0");
String termId0 obj0.getString("term_id");
String name0 obj0.getString("name");
JSONObject obj1 = categoryObject.getJSONObject("1");
String termId1 obj1.getString("term_id");
String name1 obj1.getString("name");

but i agree with wqrahd, categories should be an array

cgr
  • 519
  • 1
  • 7
  • 20
  • thanks for the answer, but it is not the best solution for current JSON, because "0" and "1" are dynamic numbers. – Arshak92 Mar 24 '14 at 10:38
1

While Ahmad Dwaik 'Warlock' has provided a very good answer but there is a mistake in his code current code is --

try
{   
    String jsonString="";//your json string here
    JSONObject jObject= new JSONObject(jsonString).getJSONObject("categories");
    Iterator<String> keys = jObject.keys();
    while( keys.hasNext() )
    {
        String key = keys.next();
        Log.v("**********", "**********");
        Log.v("category key", key);
        JSONObject innerJObject = jObject.getJSONObject(key);
        Iterator<String> innerKeys = innerJObject.keys();
        while( innerKeys.hasNext() )
        {
            String innerKkey = innerKeys.next();  //Here was the error
            String value = innerJObject.getString(innerKkey);
            Log.v("key = "+key, "value = "+value);
        }
    }
}
catch (JSONException e)
{   e.printStackTrace();    }
0

try this ->

String response = data;
JSONObject categories= new JSONObject(data).getJSONObject("categories").getJSONObject('0').getJSONObject('term_id');

print// 247