将一个包转换为JSON

我想将Intent的extras Bundle转换成JSONObject,这样我就可以将它传递给JavaScript。

有没有一个快速或最好的方式来做这个转换? 如果不是所有可能的Bundle都能正常工作,那就没问题了。

Solutions Collecting From Web of "将一个包转换为JSON"

您可以使用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

编辑:

有人指出,以前的代码没有很好地处理CollectionMaptypes。 如果您使用的是API 19或更高版本,那么有一个JSONObject#wrap方法,如果这对你很重要的话,将会有所帮助。 从文档 :

如有必要,请包裹一个物体。 如果对象为null,则返回NULL对象。 如果它是一个数组或集合,则将其包装在JSONArray中。 如果它是一个映射,将其包装在一个JSONObject中。 如果它是一个标准属性(Double,String等),那么它已经被包装了。 否则,如果它来自其中一个Java包,请将其变成一个string。 如果没有,请尝试将其包装在JSONObject中。 如果包装失败,则返回null。

 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; } 
 Object myJsonObj = bundleObject.get("yourKey"); JsonParser parser = new JsonParser(); JsonObject json = parser.parse(myJsonObj.toString()).getAsJsonObject(); json.get("memberInJson").getAsString();