Howli
Howli

Reputation: 12469

Trying to parse a jsonarray within a jsonarray

I am parsing some json in an app and I have come across arrays that sometimes have information in it:

{
    "output": [
        {
            "id": "1521",
            "name": "Apples",
        }
    ]
}

and sometimes has nothing. e.g

{
    "output": [
        []
    ]
}

I was parsing it by

JSONArray output = c.getJSONArray("output");
int outputLength = output.length();

for (int q = 0; q < outputLength; q++) 
{
    JSONObject d = outputs.getJSONObject(q);
    id[q] = d.getInt("id");
    name[q] = d.getString("name");
}

but when it gets to the empty array it crashes. I get the following error then:

01-19 01:08:00.237: W/System.err(17627): org.json.JSONException: Value [] at 0 of type org.json.JSONArray cannot be converted to JSONObject

it crashes because it's trying to convert the jsonarray into an object and you can't do that so I tried getting the first array in output with:

JSONArray add = output.getJSONArray(0);

but that will crash as well because in the first output it's an object in it and not an array. I don't have access or control over the json feed and I'm stuck at the moment as to how to parse the result.

Upvotes: 0

Views: 111

Answers (2)

dadude999
dadude999

Reputation: 316

Because you're parsing everything in the enclosing JSONArray as aJSONObject, all the entries would have to be formatted that way. For that to work, your source string would have to look like this:

[
{
    "output": [
        {
            "id": "1521",
            "name": "Apples"
        }
    ]
},
{
    "output": [
        []
    ]
}
]

Everything in the top-levelJSONArray is now a JSONObject and can be parsed accordingly. What's inside of those objects is your business (empty arrays are OK). A good resource for checking if a given JSON string is valid is this website.

Upvotes: -1

Brian Roach
Brian Roach

Reputation: 76898

The real answer is: "Fix whatever is generating that horrible JSON".

If that's not an option you're going to have to figure out exactly what you have before trying to access it. The JSONArray.optJSONObject() method can help with this; it returns null if the specified index doesn't contain a JSONObject:

JSONArray output = c.getJSONArray("output");
for (int q = 0; q < outputLength; q++) 
{
    JSONObject d = output.optJSONObject(q);
    if (d != null)
    {
        id[q] = d.getInt("id");
        name[q] = d.getString("name");
    }
}

Upvotes: 3

Related Questions