
本文详解如何使用 gson 将独立字符串(如 deviceid)结构化地注入已有 json 对象,避免字符串拼接导致的 json 格式错误,实现合法、可解析的合并结果。
本文详解如何使用 gson 将独立字符串(如 deviceid)结构化地注入已有 json 对象,避免字符串拼接导致的 json 格式错误,实现合法、可解析的合并结果。
在 Android 或 Java 开发中,常需将设备扫描数据(如 iBeacon 对象)与网关元信息(如 deviceId)一并序列化为统一 JSON 发送至服务端。但直接拼接 json + json2(如 "{}" + "{"deviceId":"..."}")会产生非法 JSON —— 两个独立 JSON 对象连在一起,既不是数组也不是对象,无法被标准 JSON 解析器识别。
正确做法是:不拼接字符串,而是在对象层面合并数据。Gson 提供了多种优雅方案,推荐以下两种主流方式:
✅ 方案一:定义封装类(推荐,类型安全、可维护性强)
如答案所示,创建一个轻量级 POJO 类,将 deviceId 作为字段纳入:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
public class Gateway {
private String deviceId;
public Gateway(String deviceId) {
this.deviceId = deviceId;
}
// getter/setter 省略(或使用 Lombok @Data)
}然后,在回调中构建完整对象并一次性序列化:
@Override
public void onIBeaconDiscovered(IBeaconDevice ibeacon, IBeaconRegion region) {
// 创建网关信息对象
Gateway gateway = new Gateway("67814f71b5bdb4d3");
// 使用 GsonBuilder 合并两个对象(关键!)
Gson gson = new Gson();
// 方法1:先转 Map,再合并,再转回 JSON(灵活通用)
JsonObject beaconJson = JsonParser.parseString(gson.toJson(ibeacon)).getAsJsonObject();
JsonObject gatewayJson = JsonParser.parseString(gson.toJson(gateway)).getAsJsonObject();
beaconJson.add("deviceId", gatewayJson.get("deviceId")); // 直接注入字段
String finalJson = beaconJson.toString();
Log.i("Beacon", "Merged JSON: " + finalJson);
// 发布合并后的合法 JSON
new Handler().postDelayed(() -> publish(finalJson), 5000);
}✅ 方案二:使用 JsonObject 动态构建(无需额外类,适合简单场景)
若不想定义新类,可借助 Gson 的 JsonObject 手动组装:
@Override
public void onIBeaconDiscovered(IBeaconDevice ibeacon, IBeaconRegion region) {
Gson gson = new Gson();
JsonObject beaconObj = JsonParser.parseString(gson.toJson(ibeacon)).getAsJsonObject();
// 直接添加 deviceId 字段
beaconObj.addProperty("deviceId", "67814f71b5bdb4d3");
String finalJson = beaconObj.toString();
Log.i("Beacon", "Merged JSON: " + finalJson);
new Handler().postDelayed(() -> publish(finalJson), 5000);
}⚠️ 注意事项
- ❌ 禁止字符串拼接 JSON:json + json2 生成的是 "{}{}",违反 JSON 规范(RFC 8259),后端解析必报错。
- ✅ 确保字段名一致:如 deviceId 在 JSON 中应为 "deviceId"(双引号),而非 {deviceId : ...}(这是 JavaScript 对象字面量,非标准 JSON)。
- ? 验证输出合法性:可将日志中的 JSON 粘贴至 https://www.php.cn/link/93975f35e2b50d0bc399f9b5db16c9d5 验证格式。
- ? 空值安全:使用 addProperty() 前建议判空,或配置 Gson:new GsonBuilder().serializeNulls().create()。
通过对象合并而非字符串拼接,你不仅能获得结构清晰、语义明确的 JSON 输出,还能提升代码健壮性与后期扩展能力——例如后续增加 gatewayType、timestamp 等字段时,只需修改 POJO 或 JsonObject,无需重构序列化逻辑。

















