将捆绑包转换为 JSON
2022-09-01 12:35:32
我想将 Intent 的 extras Bundle 转换为 JSONObject,以便我可以将其传递到 JavaScript/从 JavaScript 传递。
有没有快速或最好的方法来进行此转换?如果不是所有可能的捆绑包都可以工作,那就没问题了。
我想将 Intent 的 extras Bundle 转换为 JSONObject,以便我可以将其传递到 JavaScript/从 JavaScript 传递。
有没有快速或最好的方法来进行此转换?如果不是所有可能的捆绑包都可以工作,那就没问题了。
您可以使用 来获取捆绑包包含的密钥列表。然后,您可以循环访问这些键,并将每个键值对添加到 :Bundle#keySet()
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
编辑:
有人指出,以前的代码处理不善,类型也很好。如果您使用的是 API 19 或更高版本,那么如果有一种方法对您很重要,则此方法会有所帮助。从文档中:Collection
Map
JSONObject#wrap
如有必要,请包装对象。如果对象为 null,则返回 NULL 对象。如果它是数组或集合,请将其包装在 JSON 数组中。如果它是映射,请将其包装在 JSON 对象中。如果它是一个标准属性(Double,String等),那么它已经被包装了。否则,如果它来自其中一个java包,请将其转换为字符串。如果没有,请尝试将其包装在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;
}