You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android跨Activity传递JsonObject及Json字符串转JsonObject方法

Android 跨Activity传递JSONObject问题解决方案

字符串转JSONObject失败的修复

你遇到的转换失败问题,90%以上是两类原因导致:

  1. 序列化/传值过程中对JSON字符串做了多余的转义、编码操作,破坏了JSON结构
  2. JSON内容过长(比如你示例中profile_image是base64格式图片),超出Intent传值1MB左右的大小限制,字符串被系统直接截断

正确的字符串传值+转换写法

Activity A 侧:

// apiResp为接口返回的原始JSONObject对象
String jsonString = apiResp.toString(); // 直接调用原生toString()序列化,不要做URLEncode、字符替换等额外操作
Intent intent = new Intent(ActivityA.this, ActivityB.class);
intent.putExtra("key_json", jsonString);
startActivity(intent);

Activity B 侧:

String jsonString = getIntent().getStringExtra("key_json");
// 转换前可先打印jsonString日志,确认内容完整、无多余转义符
try {
    JSONObject apiResp = new JSONObject(jsonString);
    // 拿到对象后即可直接用于POST请求参数组装
    int statusCode = apiResp.getInt("status_code");
    JSONObject data = apiResp.getJSONObject("data");
} catch (JSONException e) {
    e.printStackTrace();
}

直接传递JSONObject无需转字符串的方案

下面两种是生产环境常用的实现,不需要手动做字符串转换:

  • 方案1:直接传序列化对象
    原生org.json.JSONObject已经实现了Serializable接口,支持直接放入Intent传递,代码最简洁:

    // Activity A 传值
    intent.putExtra("key_json_obj", apiResp);
    
    // Activity B 取值
    JSONObject apiResp = (JSONObject) getIntent().getSerializableExtra("key_json_obj");
    

    注意:该方案同样受Intent 1MB大小限制,不适合带超长base64、大段文本的大JSON对象。

  • 方案2:临时内存存储(适配大JSON场景)
    如果JSON体积较大,走Intent传递会触发TransactionTooLargeException,用单例临时存储是最稳定的方案,没有大小限制,也不会有序列化、转义问题:
    先定义临时存储类:

    public class JsonTempHolder {
        private static final JsonTempHolder INSTANCE = new JsonTempHolder();
        private JSONObject cacheResp;
    
        public static JsonTempHolder getInstance() {
            return INSTANCE;
        }
    
        public void cacheJson(JSONObject resp) {
            this.cacheResp = resp;
        }
    
        public JSONObject pollJson() {
            JSONObject result = cacheResp;
            cacheResp = null; // 取值后立即清空,避免内存泄漏
            return result;
        }
    }
    

    跳转前在Activity A存入:

    JsonTempHolder.getInstance().cacheJson(apiResp);
    startActivity(intent);
    

    在Activity B的onCreate方法中直接取值:

    JSONObject apiResp = JsonTempHolder.getInstance().pollJson();
    

内容的提问来源于stack exchange,提问作者Rahul Pandey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 16:36:43