使用OneSignal发通知:JSONArray加入JSONObject后格式异常求助
解决OneSignal通知中
include_player_ids被序列化为字符串的问题 我帮你定位到了两个导致问题的核心原因,以及对应的修复方案:
问题根源
- 错误的JSONArray实现包:你使用的是
org.json.alt.JSONArray这个替代版本,它在和JSONObject交互时,会被错误地序列化为带引号的字符串格式,而非标准的JSON数组。 - 操作顺序不合理:你先把空的
player_id数组添加到notification对象中,之后才往数组里添加用户ID。虽然对象引用是同一个,但这种顺序可能导致序列化时无法正确识别数组的实际内容。
修复后的代码
替换为标准的org.json.JSONArray包,并调整操作顺序(先填充数组,再将数组放入通知对象):
import org.json.JSONException; import org.json.JSONObject; import org.json.JSONArray; // 使用官方标准JSON包 JSONObject headings = new JSONObject(); JSONObject contents = new JSONObject(); JSONArray playerIdArray = new JSONArray(); JSONObject notification = new JSONObject(); try { // 先向数组添加用户ID,确保数组已有内容 playerIdArray.put(idUser); // 再将填充好的数组放入通知对象 notification.put("app_id", appId); notification.put("include_player_ids", playerIdArray); // 处理通知标题和内容 headings.put("en", "my_title"); contents.put("en", "my_text"); notification.put("headings", headings); notification.put("contents", contents); // 可以打印验证生成的JSON格式是否正确 System.out.println(notification.toString()); } catch (JSONException e) { System.out.println("JSONException :" + e.getMessage()); }
修复逻辑说明
- 标准JSON包适配:
org.json.JSONArray是官方推荐的实现,它和JSONObject交互时会被正确序列化为["my-player-id"]这种数组格式,不会额外添加引号。 - 合理的操作顺序:先填充数组再放入对象,确保序列化时数组已经包含所需的用户ID,避免空数组或未正确初始化的数组被序列化的问题。
修复后生成的JSON会完全符合OneSignal的要求,不会再返回include_player_ids must be an array的错误提示。
内容的提问来源于stack exchange,提问作者VictorGalisson
相关产品推荐
相关产品推荐

