Java 将包转换为JSON

Java 将包转换为JSON,java,android,json,android-intent,Java,Android,Json,Android Intent,我想将一个Intent的extras包转换成一个JSONObject,这样我就可以将它传递给JavaScript或从JavaScript传递出去 有没有一种快速或最好的方法来进行转换?如果不是所有可能的Bundle都能工作,那也没关系。您可以使用Bundle\keySet()获取Bundle包含的密钥列表。然后可以迭代这些键,并将每个键值对添加到JSONObject: JSONObject json = new JSONObject(); Set<String> keys = bun

我想将一个Intent的extras包转换成一个JSONObject,这样我就可以将它传递给JavaScript或从JavaScript传递出去

有没有一种快速或最好的方法来进行转换?如果不是所有可能的Bundle都能工作,那也没关系。

您可以使用
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 json=new JSONObject();
Set keys=bundle.keySet();
用于(字符串键:键){
试一试{
//put(key,bundle.get(key));参见下面的编辑
put(key,JSONObject.wrap(bundle.get(key));
}捕获(JSONException e){
//在这里处理异常
}
}
请注意,
JSONObject#put
需要捕获一个
JSONException

编辑:

有人指出,前面的代码不能很好地处理
Collection
Map
类型。如果您使用的是API 19或更高版本,那么有一个
JSONObject#wrap
方法,如果这对您很重要,它将提供帮助。从:

如有必要,包裹对象。如果对象为null,则返回null 对象如果它是数组或集合,则将其包装在JSONArray中。如果是 是一个映射,将其包装在JSONObject中。如果它是标准属性 (Double、String等)然后它已经被包装好了。否则,如果 来自某个java包,将其转换为字符串。如果它 否则,请尝试将其包装到JSONObject中。如果包装失败,那么 返回null

私有字符串getJson(最终绑定){
if(bundle==null)返回null;
JSONObject JSONObject=新的JSONObject();
for(字符串键:bundle.keySet()){
Object obj=bundle.get(键);
试一试{
jsonObject.put(key,wrap(bundle.get(key));
}捕获(JSONException e){
e、 printStackTrace();
}
}
返回jsonObject.toString();
}
公共静态对象换行(对象o){
如果(o==null){
返回JSONObject.NULL;
}
if(o JSONArray的instanceof | | o JSONObject的instanceof){
返回o;
}
if(o.equals(JSONObject.NULL)){
返回o;
}
试一试{
if(o集合的实例){
返回新的JSONArray((集合)o);
}else if(o.getClass().isArray()){
返回杰索纳雷(o);
}
if(o映射的实例){
返回新的JSONObject((Map)o);
}
如果(o)实例为布尔型||
o字节实例||
o字符实例||
双实例||
浮点数的实例||
o整数实例||
o长实例||
o短实例||
o instanceof字符串){
返回o;
}
if(o.getClass().getPackage().getName().StartWith(“java”)){
返回o.toString();
}
}捕获(忽略异常){
}
返回null;
}
公共静态JSONArray到JSONArray(对象数组)抛出JSONException{
JSONArray结果=新的JSONArray();
如果(!array.getClass().isArray()){
抛出新的JSONException(“不是基元数组:+array.getClass());
}
final int length=Array.getLength(数组);
对于(int i=0;i
这是一个Gson类型的适配器工厂,它将捆绑包转换为JSON


你的额外服务是什么?我不想处理特定的额外服务。我想要一些通用的代码来做这件事,因为这个代码路径可以被我以外的开发人员用来处理任意数据。这个实现似乎不能正确地处理映射或列表。您应该检查从bundle中获得的对象的类型,如果它是一个映射,您可以使用新的JSONObject(映射)构造函数,如果它是一个列表,您可以使用新的JSONArray(列表)Good调用。如果您不想进行检查,还有一个
JSONObject#wrap
方法可以为您进行包装。酷。我不知道这个函数的存在,这让它变得简单多了。我注意到这个函数只在android SDK的第19版中可用,但是你可以从源代码中复制这个函数。喝倒采更新了答案以反映这一点。我使用gson是因为JSONObject.wrap需要构建19。如果您有一个使用gson反序列化的预期对象:P
Object myJsonObj = bundleObject.get("yourKey");
JsonParser parser = new JsonParser();
JsonObject json = parser.parse(myJsonObj.toString()).getAsJsonObject();
json.get("memberInJson").getAsString();
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;
}