fastJSON 解决kafka消息斜杠转义问题

news2024/9/22 23:31:34

Bug: kafka发送消息时的JSON转义异常

问题描述:

问题描述:kafka消息发送出去但是消费者执行相关逻辑的时候报错.

场景:当时实习的时候需要模拟数据做一个实时经纬度传输的接口,使用kafka实时发送消息将数据同步到数据库中

问题分析:

fastjson使用不当可能导致转义异常**,kafka消息发送出去但是消费不了原因是 发送到kafka中的消息会带一堆斜杠的转义字符**导致消费者获取数据执行相关业务之后报错:类似于下面这种

"[{\"birthday\":\"2000\",\"major\":[\"挖掘机\",\"炒菜\"],\"name\":\"xiaoming\",\"comment\":\"hello world\",\"age\":25.2,\"status\":0}]";

问题解决:

JSONObject.toJSONString() 是阿里巴巴的 fastjson 库中的一个方法,用于将 JSONObject 对象转换为其对应的 JSON 格式的字符串表示。这个方法在需要将 JSON 对象以字符串形式存储、传输或打印到控制台等场景时非常有用。

https://blog.csdn.net/qq_27706119/article/details/104828285 参考

image-20240409104720259

实例代码

@Service
@Slf4j
public class KafKaSendServiceImpl implements KafKaSendService {
	// 封装的kafka客户端
    @Resource
    private KafkaCommonService kafkaCommonService;


    @Override
    public void deviceGatVideoModelDtoSend() {
		// 模拟数据
        DeviceGatVideoModelDto device = new DeviceGatVideoModelDto(
                "c2", "d2", "设备2", "海康威视", "m2", "o2", "320123200003043342", "江宁区", "百家湖", 2,
                "c22", 2, 2, "102", 2, 200, "2025-8-2", "20002002", "192.168.1.128", 3862,
                "qq456", 2, "部分支持", 2, 120.46, 35.61, 3, "456456", false, "anotherString1"
        );

        log.info("kafka发送消息:DEVICE_VIDEO_TOPIC");
        kafkaCommonService.kafkaSendMessage("DEVICE_VIDEO_TOPIC", JSONObject.toJSONString(device));
        log.info("kafka发送消息后:DEVICE_VIDEO_TOPIC");

    }

    @Override
    public void notifyMobilePositionDtoSend() {
        NotifyMobilePositionDto dto = new NotifyMobilePositionDto("d1", "1", "c1", "1", "2024-01-01",
                "120.45", "35.6", "20", "15", "100",2);
        log.info("kafka发送消息:NOTIFY_MOBILE_POSITION_TOPIC");
        kafkaCommonService.kafkaSendMessage("NOTIFY_MOBILE_POSITION_TOPIC",JSONObject.toJSONString(dto));
    }

    @Override
    public void merge(){
        deviceGatVideoModelDtoSend();
        notifyMobilePositionDtoSend();
    }

}

核心代码

kafkaCommonService.kafkaSendMessage("DEVICE_VIDEO_TOPIC", JSONObject.toJSONString(device2));

代码理解

JSONObject.toJSONString() 是阿里巴巴的 fastjson 库中的一个方法,用于将 JSONObject 对象转换为其对应的 JSON 格式的字符串表示。这个方法在需要将 JSON 对象以字符串形式存储、传输或打印到控制台等场景时非常有用。

这行代码调用了kafkaCommonServicekafkaSendMessage方法,用于发送Kafka消息。

  • "DEVICE_VIDEO_TOPIC":这是Kafka的主题名称,消息会被发送到这个主题。
  • JSONObject.toJSONString(device):这是消息的内容。JSONObject.toJSONString是fastjson库的一个方法,用于将Java对象转换为JSON格式的字符串。在这里,它将`device对象转换为其JSON字符串表示。

  • 功能描述

这个方法会遍历 JSONObject 对象中的所有键值对,并按照 JSON 的语法规则将它们转换成一个字符串。键和字符串类型的值通常会被双引号包围,而其他类型的值(如数字、布尔值等)则按照其对应的 JSON 表示形式输出。

  • 示例
import com.alibaba.fastjson.JSONObject;  
  
public class FastjsonExample {  
    public static void main(String[] args) {  
        // 创建一个JSONObject对象  
        JSONObject jsonObject = new JSONObject();  
        jsonObject.put("name", "Alice");  
        jsonObject.put("age", 30);  
        jsonObject.put("isStudent", false);  
  
        // 将JSONObject转换为JSON格式的字符串  
        String jsonString = jsonObject.toJSONString();  
  
        // 打印转换后的JSON字符串  
        System.out.println(jsonString);  
    }  
}

总结:

所以,JSONObject.toJSONString(device)的作用是将device对象转换为一个JSON格式的字符串,这样它就可以作为Kafka消息的内容被发送。在Kafka中,消息通常是字符串或字节数组,因此,将对象转换为JSON字符串是一种常见的方式来发送结构化数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1934278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【系统架构设计】操作系统(一)

操作系统(一) 操作系统的类型和结构操作系统基本原理进程管理进程三态模型挂起状态进程互斥 / 进程同步前趋图进程调度死锁 存储管理设备管理文件管理作业管理 操作系统原理的关键在于“一个观点、两条线索”:一个观点是以资源管理的观点来定…

Rust Result 与可恢复的错误

Result 与可恢复的错误 大部分错误并没有严重到需要程序完全停止执行。有时,一个函数会因为一个容易理解并做出反应的原因失败。例如,如果因为打开一个并不存在的文件而失败,此时我们可能想要创建这个文件,而不是终止进程。 回忆…

Python进阶(4)--正则表达式

正则表达式 在Python中,正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,它允许你使用一种特殊的语法来匹配、查找、替换字符串中的文本。 在这之前,还记得之前我们是通过什么方法分割…

动手做Agent:产品经理与程序员的相爱想杀

引言 以前在大厂做产品经理的时候,很多次我恨不得想要撸起袖子自己 coding。现在自己独立开始做,才知道动手开发的确比想象中困难,尽管我勉强也可以看得懂代码,真是“眼看百遍不如动手一遍”。 就像周末我立下豪言给小幼兽 DIY …

机器学习第四十八周周报 IAGNN

文章目录 week48 IAGNN摘要Abstract0. 前言1. 题目2. Abstract3. 网络结构3.1 问题定义3.2 IAGNN 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.4 实验结果 5. 结论6.代码复现小结参考文献 week48 IAGNN 摘要 本周阅读了题为Interaction-Aware Graph Neural Networks…

SpringCloud------Sentinel(微服务保护)

目录 雪崩问题 处理方式!!!技术选型 Sentinel 启动命令使用步骤引入依赖配置控制台地址 访问微服务触发监控 限流规则------故障预防流控模式流控效果 FeignClient整合Sentinel线程隔离-------故障处理线程池隔离和信号量隔离​编辑 两种方式优缺点设置方式 熔断降级-----…

【C++初阶】多态

重写子类时不要求必须有 virtual 关键字 虚函数允许派生类重写这个函数,并确保即使是通过基类指针调用该函数,也能调用到派生类的版本 虚函数关键字 virtual 只在声明时加上,在类外实现时不用加 虚函数只需在类声明中加上 virtual 关键字&a…

COD论文学习 ZoomNext

现有方法的不足之处 高内在相似性:伪装物体与背景之间的高内在相似性使得检测变得困难,现有方法难以准确区分二者。多样化的规模和模糊的外观:伪装物体在规模和外观上多样化,且可能严重遮挡,导致现有方法难以处理。不…

景联文科技构建高质量心理学系知识图谱,助力大模型成为心理学科专家

心理大模型正处于快速发展阶段,在临床应用、教育、研究等多个领域展现出巨大潜力。 心理学系知识图谱能够丰富心理大模型的认知能力,使其在处理心理学相关问题时更加精确、可靠和有洞察力。这对于提高心理健康服务的质量和效率、促进科学研究以及优化教育…

vue项目build以后整合到springboot项目里面---------gxl

很多时候我们需要用到vue的组件,但是全栈的背景下懒得去搞前后端分离,很多权限校验后台都写好了,没必要再去做接口或者前端写一遍了,因此我们需要把打包后的项目整合到项目里面。 整合也很简单,照常vue项目开发&#…

Seaborn库学习之heatmap()函数

Seaborn库学习之heatmap(函数) 一、简介 seaborn.heatmap是Seaborn库中用于绘制热图(Heatmap)的函数。热图是一种数据可视化技术,通过颜色的变化来展示数据矩阵中的数值大小。这种图表非常适合展示数值数据的分布和关系,尤其是在…

什么是MIMO?(通俗易懂)

MIMO,一句话解释:多输入多输出(Multi Input Multi output) 用图说话,图①-图④,分别代表: ① SISO:单输入单输出 ( Single Input Single Output ) ② SIMO:单输入多输出…

YOLOV5学习记录

前言: 计算机视觉 什么是目标检测? 物体分类和目标检测的区别 目标检测,物体的类别和位置 学习选题,口罩检查,人脸识别 算法原理:知乎,csdn,目前还没到这种程度 大大滴崩溃&am…

木舟0基础学习Java的第二十天(线程,实现,匿名有名,休眠,守护,加入,设计,计时器,通信)

多线程 并发执行的技术 并发和并行 并发:同一时间 有多个指令 在单个CPU上 交替执行 并行:同一时间 有多个指令 在多个CPU上 执行 进程和线程 进程:独立运行 任何进程 都可以同其他进程一起 并发执行 线程:是进程中的单个顺…

鸿蒙语言基础类库:【@system.mediaquery (媒体查询)】

媒体查询 说明: 从API Version 7 开始,该接口不再维护,推荐使用新接口[ohos.mediaquery]。本模块首批接口从API version 3开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import mediaquery from sy…

【进阶篇-Day10:JAVA中泛型、平衡二叉树、红黑树、TreeSet集合的介绍】

目录 1、泛型1.1 泛型类1.2 泛型方法1.3 泛型接口1.4 泛型通配符1.5 总结 2、数据结构(树)2.1 树的基本介绍2.2 二叉树的介绍2.2.1 概念:2.2.2 二叉查找树的介绍:2.2.3 二叉查找树添加节点:2.2.4 二叉查找树查找节点&a…

window11 部署llama.cpp并运行Qwen2-0.5B-Instruct-GGUF

吾名爱妃,性好静亦好动。好编程,常沉浸于代码之世界,思维纵横,力求逻辑之严密,算法之精妙。亦爱篮球,驰骋球场,尽享挥洒汗水之乐。且喜跑步,尤钟马拉松,长途奔袭&#xf…

从零开始读RocketMq源码(五)Consumer消费Message流程解析

目录 前言 准备 拉取服务和重平衡服务启动 初识PullRequest 重平衡服务 对重平衡资源进行排序 MessageQueue消息队列集合来源 Consumer消费者集合数据来源 确实分配资源策略 执行分配策略 初始化ProcessQueue 初始化PullRequest 内存队列填充PullRequest 消息拉取…

hackmyvm--Decode

环境 靶机:ip未知 攻击机kali:192.168.233.128 192.168.56.101 主机探测 锁定靶机ip为108 端口扫描 nmap -p- -T4 -A 192.168.56.108 常规套路80和22 web打点 dirsearch -u http://192.168.56.108/ 访问robots,txt文件 访问/decode 发现其自动添加了/,怀…

Chromium源码阅读(9):了解Log模块

Chromium许多日志被TraceEvent代替了,因此TraceEvent出现的频率要比Log高很多。 但是也有不少场景使用Log。 在blink,Log的实现由base提供,而blink/render/core/base/logging.h进行了二次封装。 日志系统的设计细节 错误对话框处理 错误消…