如何正确将 JSONObject 发送至 AWS SQS 队列

发布时间 - 2026-01-29 00:00:00    点击率:

aws sqs 要求消息体必须是合法的 json 字符串,而 `jsonobject` 是 java 对象,并非字符串;直接传递 `jsonobject` 会导致序列化异常或空内容(如 `{empty:true}`),需显式调用 `.tostring()` 转为标准 json 字符串后再发送。

在使用 Spring Cloud AWS 的 QueueMessagingTemplate.convertAndSend() 方法向 Amazon SQS 发送消息时,底层会依赖 Jackson 或默认的 MessageConverter 对传入对象进行序列化。该方法对不同类型的输入行为如下:

  • String 类型:直接作为消息体发送,无需额外序列化;
  • 自定义 Java Bean(如 TaskMessage):由 Jackson 自动序列化为标准 JSON 字符串(前提是字段可访问、无循环引用等);
  • org.json.JSONObject 类型:它不是标准 POJO,也不实现 Serializable 的语义化序列化契约;Spring 默认的 MappingJackson2MessageConverter 无法正确识别其结构,可能触发其内部 empty 标志逻辑(尤其在老版本 org.json:json 中),最终导致消息体被错误地序列化为 { "empty": true }。

正确做法:始终发送 JSON 字符串

应确保传入 convertAndSend() 的参数是 String 类型,且内容为格式良好的 JSON:

public String toJson() throws JSONException {
    JSONObject json = new JSONObject();
    json.put("payload", this.payload);
    json.put("id", this.taskId);
    return json.toString(); // ← 关键:转为字符串!
}

然后调用:

queueMessa

gingTemplate.convertAndSend(queueUrl, task.toJson());

补充说明与最佳实践

  • ⚠️ 不要依赖 JSONObject 对象本身作为消息载荷 —— 它是工具类,不是数据载体;

  • ✅ 推荐统一使用 Jackson(ObjectMapper)处理序列化,更可控、兼容性更好:

    private static final ObjectMapper mapper = new ObjectMapper();
    
    public String toJson() throws JsonProcessingException {
        return mapper.writeValueAsString(Map.of(
            "payload", this.payload,
            "id", this.taskId
        ));
    }
  • ? 若必须使用 org.json,请确认依赖版本(建议 ≥ 20250227),并避免嵌套 JSONObject/JSONArray 中含非标准类型(如 LocalDateTime),否则 toString() 可能抛异常;

  • ? 测试建议:发送前打印 json.toString() 结果,验证是否输出预期 JSON(如 {"payload":"data","id":"123"}),而非 {} 或 {empty:true}。

总之,SQS 消息体本质是纯文本协议,一切需归结为合法 JSON 字符串——这是集成中最易忽视却最关键的一环。


# java  # js  # json  # app  # 工具  # amazon  # spring  # spring cloud  # String  # 字符串  # 循环  # 对象  # 序列化  # 这是  # 也不  # 它是  # 自定义  # 而非  # 最关键  # 请确认  # 不同类型  # 再发 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站制作壁纸教程视频,电脑壁纸网站?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  如何挑选最适合建站的高性能VPS主机?  Thinkphp 中 distinct 的用法解析  高端网站建设与定制开发一站式解决方案 中企动力  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  如何在Windows服务器上快速搭建网站?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  北京网站制作公司哪家好一点,北京租房网站有哪些?  Android 常见的图片加载框架详细介绍  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  java ZXing生成二维码及条码实例分享  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  如何获取上海专业网站定制建站电话?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  高端云建站费用究竟需要多少预算?  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  如何在阿里云高效完成企业建站全流程?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  微信小程序 scroll-view组件实现列表页实例代码  Android中AutoCompleteTextView自动提示  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  在线教育网站制作平台,山西立德教育官网?  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  如何快速生成橙子建站落地页链接?  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  长沙做网站要多少钱,长沙国安网络怎么样?  深圳网站制作培训,深圳哪些招聘网站比较好?  使用C语言编写圣诞表白程序  音乐网站服务器如何优化API响应速度?  如何做网站制作流程,*游戏网站怎么搭建?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel如何处理文件下载请求?(Response示例)  浅析上传头像示例及其注意事项  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  phpredis提高消息队列的实时性方法(推荐)  如何在七牛云存储上搭建网站并设置自定义域名?  Swift中swift中的switch 语句