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 对象以字符串形式存储、传输或打印到控制台等场景时非常有用。
这行代码调用了kafkaCommonService
的kafkaSendMessage
方法,用于发送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字符串是一种常见的方式来发送结构化数据。