【问题标题】:Spring Kafka consumer parse JSON as StringSpring Kafka 消费者将 JSON 解析为字符串
【发布时间】:2021-11-05 16:06:47
【问题描述】:

我正在使用 Spring Kafka 来使用来自某个主题的消息。下面是消费者将要收听的对象的结构。

{
  "identifier": "ABCD1234",
  "data": {
            "id": 12345,
            "source": 'Dashboard',
            "status": 'SUCCESS',
        }
} 

要使用这些对象,我需要使用 JsonDeserilizer。但令人担忧的是这个 JSON 的数据部分不会被修复。它可能有不同的结构。生产者将以属性不同于上述格式的任何其他格式发送数据。

如果我必须创建 JsonDeserlizer,那么我需要将各个属性映射到 Java 模型类。我认为将data 解析为字符串会简化事情

这是我现在使用的代码。但它会将所有内容解析为字符串。

@Bean
public ConsumerFactory<String, String> consumerFactory() {
    Map<String, Object> config = new HashMap<>();
    config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaConfig.getConsumerBootstrapServers());
    config.put(ConsumerConfig.GROUP_ID_CONFIG, GROUP_ID_CONFIG);
    config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, AUTO_OFFSET_RESET_CONFIG);

    return new DefaultKafkaConsumerFactory<>(config, new StringDeserializer(),
            new StringDeserializer());
}

@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerFactory(ConsumerFactory<String, String> consumerFactory) {
    ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(consumerFactory);
    return factory;
}

如何将数据字段解析为字符串?简而言之,使用 JsonDeserilizer 解析整个对象,但将 data 字段解析为字符串。

TIA

【问题讨论】:

    标签: java spring-boot apache-kafka spring-kafka


    【解决方案1】:

    你可以简单地使用这样的类来解析,

    public class MainObject {
        private String identifier;
        private String data;
    }
    

    data 字段将包含您的 JSON 对象作为字符串。然后你可以使用ObjectMapper之类的东西来反序列化它。

    更新

    正如@OneCricketeer 所说,您也可以使用JsonNode

    public class MainObject {
        private String identifier;
        private JsonNode data;
    }
    

    如果您无法使用MainObject 中已有的任何内容来确定data 字段中的内容,则它会更有用。

    【讨论】:

    • 好的,但是消费者工厂的反序列化器是什么?
    • JsonDeserilizer 当然。我想知道您如何知道data 字段中的内容?您是否在 identifier 字段中使用值?
    • 你应该使用JsonNode data
    猜你喜欢
    • 2018-07-04
    • 2019-04-07
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2020-08-11
    • 2016-12-09
    相关资源
    最近更新 更多