Преобразование пакета в 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;
}
Ответ 3
Вот адаптер типа Gson factory, который преобразует Bundle в JSON.
https://github.com/google-gson/typeadapters/blob/master/android/src/main/java/BundleTypeAdapterFactory.java
Ответ 4
Object myJsonObj = bundleObject.get("yourKey");
JsonParser parser = new JsonParser();
JsonObject json = parser.parse(myJsonObj.toString()).getAsJsonObject();
json.get("memberInJson").getAsString();