Преобразование пакета в JSON

Я хотел бы преобразовать пакет Intent extras Bundle в JSONObject, чтобы передать его в/из JavaScript.

Есть ли быстрый или лучший способ сделать это преобразование? Было бы хорошо, если бы не все возможные Связки работали.

Ответы

Ответ 1

Вы можете использовать Bundle#keySet(), чтобы получить список ключей, которые содержит Bundle. Затем вы можете перебирать эти ключи и добавлять каждую пару "ключ-значение" в 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
    }
}

Обратите внимание, что JSONObject#put потребует, чтобы вы поймали JSONException.

Edit:

Было указано, что предыдущий код не очень хорошо обрабатывал типы Collection и Map. Если вы используете API 19 или выше, существует метод JSONObject#wrap, который поможет, если это важно для вас. Из docs:

При необходимости оберните объект. Если объект имеет значение null, верните NULL объект. Если это массив или коллекция, оберните его в JSONArray. Если оно представляет собой карту, оберните ее в JSONObject. Если это стандартное свойство (Double, String, et al), то он уже завернут. В противном случае, если это происходит из одного из пакетов java, превращает его в строку. И если это не пытайтесь обернуть его в JSONObject. Если обертка завершается неудачей, тогда null возвращается.

Ответ 2

private String getJson(final Bundle bundle) {
    if (bundle == null) return null;
    JSONObject jsonObject = new JSONObject();

    for (String key : bundle.keySet()) {
        Object obj = bundle.get(key);
        try {
            jsonObject.put(key, wrap(bundle.get(key)));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    return jsonObject.toString();
}

public static Object wrap(Object o) {
    if (o == null) {
        return JSONObject.NULL;
    }
    if (o instanceof JSONArray || o instanceof JSONObject) {
        return o;
    }
    if (o.equals(JSONObject.NULL)) {
        return o;
    }
    try {
        if (o instanceof Collection) {
            return new JSONArray((Collection) o);
        } else if (o.getClass().isArray()) {
            return toJSONArray(o);
        }
        if (o instanceof Map) {
            return new JSONObject((Map) o);
        }
        if (o instanceof Boolean ||
                o instanceof Byte ||
                o instanceof Character ||
                o instanceof Double ||
                o instanceof Float ||
                o instanceof Integer ||
                o instanceof Long ||
                o instanceof Short ||
                o instanceof String) {
            return o;
        }
        if (o.getClass().getPackage().getName().startsWith("java.")) {
            return o.toString();
        }
    } catch (Exception ignored) {
    }
    return null;
}

public static JSONArray toJSONArray(Object array) throws JSONException {
    JSONArray result = new JSONArray();
    if (!array.getClass().isArray()) {
        throw new JSONException("Not a primitive array: " + array.getClass());
    }
    final int length = Array.getLength(array);
    for (int i = 0; i < length; ++i) {
        result.put(wrap(Array.get(array, i)));
    }
    return result;
}

Ответ 4

Object myJsonObj = bundleObject.get("yourKey");
JsonParser parser = new JsonParser();
JsonObject json = parser.parse(myJsonObj.toString()).getAsJsonObject();
json.get("memberInJson").getAsString();