Kafka发送org.json.JSONObject适用序列化器及传输方案选择
你当前的生产者配置指定了value的序列化器为StringSerializer:
Map<String, Object> props = kafkaProperties.buildProducerProperties(); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
该序列化器仅支持CharSequence类型的对象序列化,传入org.json.JSONObject类型时无法完成转换,因此抛出对应报错。
问题1:org.json.JSONObject类型的消息应当使用哪种序列化器?
有两种可行方案:
- 继续使用现有
org.apache.kafka.common.serialization.StringSerializer:发送消息前先调用JSONObject的toString()方法转为字符串即可适配配置 - 自定义
org.json.JSONObject专属序列化器:实现Serializer<org.json.JSONObject>接口,重写serialize方法,在方法内部调用jsonObject.toString().getBytes(StandardCharsets.UTF_8)返回字节数组,再将生产者配置的value.serializer改为自定义序列化器的全类名即可
注意:Kafka自带的JsonSerializer和Spring Kafka封装的Jackson2JsonSerializer均基于Jackson库实现,仅支持Jackson的JsonNode、自定义POJO对象序列化,无法直接处理org.json.JSONObject类型
问题2:直接传递JSONObject更好,还是先转为String再发送更好?
优先推荐先调用jsonObject.toString()转为String再发送,优势如下:
- 无需额外开发自定义序列化器,降低代码维护成本,避免自定义序列化逻辑bug导致的数据异常
- 兼容性更强:消费者侧无需感知生产者的序列化逻辑,不管使用什么语言、什么JSON库都可以直接拿到JSON字符串做解析
- 问题排查更便捷:需要打印日志排查消息内容时,字符串格式可直接输出,不需要额外做类型转换
如果全链路生产、消费逻辑都统一使用org.json.JSONObject处理JSON数据,且希望简化发送代码,也可以选择自定义序列化器后直接传JSONObject。两种方式最终写入Kafka的字节内容完全一致,没有性能或数据差异。
内容的提问来源于stack exchange,提问作者Gavin Smith
相关产品推荐
相关产品推荐

