他
我无法反序列化来自kafka主题的json字符串。 蛇形和驼形结构混合使用属性,例如: 输入:
{
"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()反序列化,但是没有用。
谢谢前进!
答案 0 :(得分:2)
如果您使用的是jackson
,则可以使用@JsonProperty
6.1. @JsonProperty
@JsonProperty("event_type")
private String eventType;
或者您可以将属性PropertyNamingStrategy.SNAKE_CASE设置为ObjectMapper
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
答案 1 :(得分:0)
您可以使用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();
对于Producer,仅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);
}
}