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

使用OneSignal发通知:JSONArray加入JSONObject后格式异常求助

解决OneSignal通知中include_player_ids被序列化为字符串的问题

我帮你定位到了两个导致问题的核心原因,以及对应的修复方案:

问题根源

  1. 错误的JSONArray实现包:你使用的是org.json.alt.JSONArray这个替代版本,它在和JSONObject交互时,会被错误地序列化为带引号的字符串格式,而非标准的JSON数组。
  2. 操作顺序不合理:你先把空的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:20:48