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

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

问题描述:

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

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

问题分析:

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

json 复制代码
"[{\"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 参考

实例代码

java 复制代码
@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();
    }

}

核心代码

java 复制代码
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 表示形式输出。

  • 示例
java 复制代码
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字符串是一种常见的方式来发送结构化数据。

相关推荐
祈禾39 分钟前
Redis三大缓存问题与分布式锁
运维·数据库·redis·笔记·分布式·缓存
叠层归一研究院2 小时前
AGI 系统(五):多主体 AGI 网络 — 分布式符号边界上的时序差同构传播
分布式·php·agi
李白客7 小时前
分布式集群与数据库产业:从单机到集群的架构跃迁与市场重构
数据库·分布式·架构
传感器与混合集成电路7 小时前
储气库漏失检测技术解析:分布式光纤如何锁定环空窜漏的精确位置
分布式·数据分析·信号处理
cfm_29149 小时前
了解Sentinel
分布式·架构·sentinel
上海云盾-小余10 小时前
全域网络安全防护思路:借助分布式节点抵御异常访问实战
分布式·安全·web安全
江畔柳前堤11 小时前
LLM 量化与剪枝完全指南:从比特级数学到生产级内核
人工智能·分布式·深度学习·算法·机器学习·目标跟踪·语言模型
中议视控13 小时前
展厅可视化网络中央控制系统:支持双向反馈,可视化播控,回显,状态显示,反向控制电脑,声光电网络视讯设备统一管理
网络·分布式·信息可视化
Java成神之路-1 天前
集群架构 vs 分布式微服务架构:核心区别通俗拆解
分布式·微服务·架构
运维行者_2 天前
企业带宽监控工具实战:网络流量分析与异常排查的5个关键能力
运维·服务器·开发语言·网络·分布式·后端·php