Recursive, nested list traversal
This is in addition to what @tim already said.

The dumpList method takes a List,
and then you make 2 .get(i) calls in every iteration of the loop.
Keep in mind that the List interface doesn't ensure random access.
For example I can call this method with a LinkedList parameter,
in which case the .get(i) calls will be costly.
Either change the method parameter to ArrayList or similar random access list,
or change the way you iterate (I recommend), for example like this:

private static void dumpList(String string, List&lt;Object&gt; list) {
    int i = 0;
    for (Object item : list) {
        if (item instanceof List) {
            dumpList(string + i, (List) item);
        } else {
            System.out.println(String.format("%s%d %s", string, i, item));
        }
        ++i;
    }
}


Instead of doing if (item instanceof String) and then if (item instanceof List),
it's better to do if (item instanceof List) and an else.
This solves 2 problems at once:


Adds support for other element types, not only String and List,
which otherwise would have been ignored
The second if should have been either an else if or an else,
because if the first if was true, it's pointless to evaluate the second


I changed the string + i + " " + l.get(i) to the (in my opinion) more readable String.format("...", ...) style.

Finally, I renamed l to list.
Single-letter variable names are acceptable as loop counters, like i, j, k,
otherwise it's better to give meaningful names.