简体   繁体   中英

Nested JSONArray

I need to read a JSON file with following form:

{
"Data":[{
"foo":"22",
"bar":"33",
"array":[
{
"1foo":"22",
"1bar":"33"
},
{
"2foo":"22",
"2bar":"33",
}
],
"anotherData":{
"foofoo":"22",
"barbar":"33"
},
"some more data":"11",
"some more data":"11"
},
{and the cycle here starts again from -->
"foo":"22",
"bar":"33",
"array":[

My question stands: How do I access individual elements given it's sometimes JSONObject and sometimes JSONArray. I tried using org.json library but I'm failing to access anything after this line -> "array":[. I tried various combinations of JSONObject and JSONArray up to no avail.

My latest code looked something like this:

List<Data> data= new ArrayList<>();
        String rawJson = getJsonAsString();
        JSONObject outer = new JSONObject(rawJson);
        JSONArray jArr= outer.getJSONArray("Data");
        JSONObject inner= outer.getJSONObject("array");
for(int i =0; i<jArr.length(); i++){
JSONObject jsonEvent = jArr.getJSONObject(i);

String foo = jsonEvent.getString("foo"); <-- this works,
String 1foo = jsonEvent.getString("1foo"); <-- but this doesn't and i cant access it

I tried dozens of different solutions(tried myself and tried to find something here as well, but every case with those nested arrays is different and I can't add those solutions together to get answer for my case)

You can increase your readability if you beautify your raw JSON string:

{
   "Data":[
      {
         "foo":"22",
         "bar":"33",
         "array":[
            {
               "1foo":"22",
               "1bar":"33"
            },
            {
               "2foo":"22",
               "2bar":"33"
            }
         ],
         "anotherData":{
            "foofoo":"22",
            "barbar":"33"
         },
         "some more data":"11",
         "some more data":"11"
      },
      { and the cycle here starts again from -->
         "foo":"22",
         "bar":"33",
         "array":[
            ...
         ],
         ...
      }
   ]
}

So, stick to the following code:

JSONArray jArr = outer.getJSONArray("Data");

jArr is now filled with array of your Object.

And to loop through your Object array, you can use a for-loop which you have done it correctly.

for (int i = 0; i < jArr.length(); i++) {
    // The below gets your Object
    JSONObject jsonEvent = jArr.getJSONObject(i);
}

And now each jsonEvent contains your Object, which you can access the Object by their type.

For example, if you would like to access foo , you can use:

String foo = jsonEvent.getString("foo"); // foo = "22"
String bar = jsonEvent.getString("bar"); // bar = "33"
// Note that your array is another Array, you need to get it as JSONArray first
JSONArray arrayJson = jsonEvent.getJSONArray("array");

And as 1foo is in the first Object for your array , you need to access it like this:

JSONObject firstObjectInArray = arrayJson.getJSONObject(0);
String target = firstObjectInArray.getString("1foo"); // target = "22"

And to access foofoo , as it is an attribute of the JSON Object anotherData , so you should obtain anotherData as JSONObject first, and then you can access foofoo :

JSONObject anotherDataObject = jsonEvent.getJSONObject("anotherData");
String foofoo = anotherDataObject.getString("foofoo"); // foofoo = "22"

So the full code within your for-loop should look like this:

for (int i = 0; i < jArr.length(); i++) {
    // The below gets your Object
    JSONObject jsonEvent = jArr.getJSONObject(i);

    String foo = jsonEvent.getString("foo");
    JSONArray arrayJson = jsonEvent.getJSONArray("array");
    String target = arrayJson.getJSONObject(0).getString("1foo");

    // Add to get foofoo
    JSONObject anotherDataObject = jsonEvent.getJSONObject("anotherData");
    String foofoo = anotherDataObject.getString("foofoo");
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM