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;
}
6条答案
按热度按时间4zcjmb1e1#
你可以使用
Bundle#keySet()
来获取一个Bundle包含的键列表,然后你可以迭代这些键,并将每个键值对添加到一个JSONObject
中:注意,
JSONObject#put
将要求您捕获JSONException
。有人指出,前面的代码没有很好地处理
Collection
和Map
类型。如果您使用API 19或更高版本,有一个JSONObject#wrap
方法可以帮助您,如果这对您很重要。如有必要, Package 对象。如果对象为空,则返回NULL对象。如果对象为数组或集合,则将其 Package 在JSONArray中。如果对象为Map,则将其 Package 在JSONObject中。如果对象为标准属性(Double,String,et al),那么它已经被 Package 了。否则,如果它来自某个java包,就把它变成一个字符串。如果它不是,尝试将其 Package 在JSONObject中,如果 Package 失败,则返回null。
bxgwgixi2#
gkl3eglg3#
下面是一个将Bundle转换为JSON的Gson类型适配器工厂。
https://github.com/google-gson/typeadapters/blob/master/android/src/main/java/BundleTypeAdapterFactory.java
llmtgqce4#
如果bundle有嵌套的bundle,那么
JSONObject.wrap(bundle.get(key))
将返回null
。所以我设法让它在我的用例中使用这个递归函数。虽然还没有测试更高级的用例。nbewdwxp5#
zhte4eai6#