Convert a Bundle to JSON

android, android-intent, java, json

Solution

You can use `Bundle#keySet()` to get a list of keys that a Bundle contains. You can then iterate through those keys and add each key-value pair into a `JSONObject`:

JSONObject json = new JSONObject();
Set<String> keys = bundle.keySet();
for (String key : keys) {
    try {
        // json.put(key, bundle.get(key)); see edit below
        json.put(key, JSONObject.wrap(bundle.get(key)));
    } catch(JSONException e) {
        //Handle exception here
    }
}

Note that `JSONObject#put` will require you to catch a `JSONException`.

Edit:

It was pointed out that the previous code didn't handle `Collection` and `Map` types very well. If you're using API 19 or higher, there's a `JSONObject#wrap` method that will help if that's important to you. From the docs:

Wrap an object, if necessary. If the object is null, return the NULL object. If it is an array or collection, wrap it in a JSONArray. If it is a map, wrap it in a JSONObject. If it is a standard property (Double, String, et al) then it is already wrapped. Otherwise, if it comes from one of the java packages, turn it into a string. And if it doesn't, try to wrap it in a JSONObject. If the wrapping fails, then null is returned.

Problem

I'd like to convert the an Intent's extras Bundle into a JSONObject so that I can pass it to/from JavaScript. Is there a quick or best way to do this conversion? It would be alright if not all possible Bundles will work.

Original source