Android跨Activity传递JsonObject及Json字符串转JsonObject方法
Android 跨Activity传递JSONObject问题解决方案
字符串转JSONObject失败的修复
你遇到的转换失败问题,90%以上是两类原因导致:
- 序列化/传值过程中对JSON字符串做了多余的转义、编码操作,破坏了JSON结构
- 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
相关产品推荐
相关产品推荐

