无法反序列化来自kafka主题的json字符串,该主题在snake case中具有属性

vltsax25  于 2021-06-04  发布在  Kafka
关注(0)|答案(2)|浏览(361)


我无法反序列化来自kafka主题的json字符串。属性混合了snake case和camel case结构,例如:input:

{
"event_type" : "ABC",
"user_id" : 1567221,
"name" : "HGHAAAB" //here no snake case
"user_contact" : "12345678",
"phoneNumber" : "91222"
}

现在我想在我这边创建请求dto,如下所示:

public class KafkaRequest { 
private String eventType;
private int userId;
private String name; 
private String userContact;
private String phoneNumber;

//getters and setters

}

有谁能提出正确的方法吗?我尝试创建customnamestrategy并用objectmapper.readvalue()反序列化,但没有成功。
谢谢是提前的!!!

daupos2t

daupos2t1#

你可以使用gson有方法来定义域名策略

Gson gson = new GsonBuilder().disableHtmlEscaping().setFieldNamingStrategy(FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES).create();

甚至你也可以定义自定义

Gson gson = new GsonBuilder().disableHtmlEscaping().setFieldNamingStrategy(new FieldNamingStrategy() {
            @Override
            public String translateName(Field f) {
                return f.getName().toLowerCase(); //or any logic
            }
        }).create();

对于生产者来说,stringserializer就可以了

properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

假设你已经填充了pojo和kafkarequest,那么你就可以发布了

ProducerRecord producerRecord = new ProducerRecord<String, String>("topicName", null, gson.toJson(kafkaRequest));

在用户端,解析回pojo

properties.setProperty("key.deserializer", StringDeserializer.class.getName());
properties.setProperty("value.deserializer", StringDeserializer.class.getName());
KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(properties);
while (true) {
    ConsumerRecords<String, String> records = consumer.poll(100);
    for (ConsumerRecord<String, String> record : records) {
         KafkaRequest kafkaRequest = gson.fromJson(record.value(), KafkaRequest.class);
    }
}
pepwfjgg

pepwfjgg2#

如果您正在使用 jackson 你可以用 @JsonProperty 6.1. @jsonproperty公司

@JsonProperty("event_type")
private String eventType;

或者可以将propertynamingstrategy.u case属性设置为 ObjectMapper ```
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

相关问题