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

Android中使用JSONObject生成JSON时字段名异常替换问题

解决Android中JSONObject创建JSON时字段名被替换为a/b/c的问题

这种情况我之前帮不少开发者排查过,大概率是两个核心原因导致的,咱们一步步拆解解决:

1. 最常见诱因:代码混淆(ProGuard/R8)导致字段名被重命名

如果你的问题只出现在Release打包版本里,Debug模式完全正常,那基本可以确定是混淆工具搞的鬼。为了减小包体积,ProGuard/R8会把长字段名自动替换成a、b、c这类短标识,当JSON子元素数量较多时,这种替换就会集中显现出来。

修复方案:修改ProGuard/R8配置

在你的proguard-rules.pro文件中添加规则,保护JSON相关的类不被混淆:

  • 如果你用自定义实体类生成JSON,要保留实体类的所有字段和方法:
# 替换成你自己的实体类包路径
-keep class com.yourpackage.app.models.** { *; }
  • 如果你直接用Android原生org.json.JSONObject手动拼接JSON,但有自己封装的工具类,也要保护工具类:
-keep class com.yourpackage.app.utils.JsonCreatorUtils { *; }

2. 代码逻辑失误:手动生成了错误的键名

有时候开发者会在循环创建JSON字段时犯低级错误——用字母序列(a、b、c)代替了实际业务字段名。比如类似这样的错误代码:

// 错误示例!不要这么写
String[] values = {"rirani", "Developer", "Romin"};
JSONObject employee = new JSONObject();
for (int i = 0; i < values.length; i++) {
    // 这里用char('a'+i)生成键名,自然会得到a、b、c
    employee.put(String.valueOf((char) ('a' + i)), values[i]);
}

修复方案:检查并修正JSON创建代码

确保你调用put()方法时传入的是实际业务字段名,比如正确的写法:

JSONObject employee = new JSONObject();
employee.put("userId", "rirani");
employee.put("jobTitleName", "Developer");
employee.put("firstName", "Romin");
// 其他字段依次添加
JSONArray employees = new JSONArray();
employees.put(employee);
JSONObject result = new JSONObject();
result.put("Employees", employees);

3. 第三方JSON库的特殊配置(如果有用到)

如果你不是用原生org.json,而是用Gson、Fastjson这类第三方库,要检查是否开启了字段压缩/重命名的配置。比如Gson如果用了FieldNamingPolicy.IDENTITY之外的策略,或者Fastjson开启了某些精简配置,也可能导致字段名被替换。这种情况下,把配置改回保持原字段名的规则即可。

快速验证方法

先在Debug模式下运行测试:如果Debug下生成的JSON字段名完全正常,那肯定是混淆的问题;如果Debug下也出问题,直接检查你的JSON创建代码逻辑就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:04:46