【问题标题】:Not able to Deserialize json string coming from kafka topic which has attributes in snake case无法反序列化来自 kafka 主题的 json 字符串,该主题在蛇案例中具有属性
【发布时间】:2020-02-20 08:32:18
【问题描述】:

我无法反序列化来自 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() 反序列化,但没有成功。

先谢谢了!!!

【问题讨论】:

  • 您使用的是gson 还是jackson
  • 您的 ocde 中是否存在此拼写错误 private String userConatact
  • @Deadpool : 使用 gson,你看到的错字是什么?
  • @Deadpool :更正了错字

标签: java json apache-kafka deserialization


【解决方案1】:

如果您使用的是jackson,您可以使用@JsonProperty 6.1. @JsonProperty

@JsonProperty("event_type")
private String eventType;

或者您可以将属性PropertyNamingStrategy.SNAKE_CASE 设置为ObjectMapper

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

【讨论】:

  • 这里有一个错字:private String userConatact
  • 可能是错字我相信@Migsarmiento 让我们问问 OP
  • 嗨@Deadpool,objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE) 工作正常,但如果我在请求json 中有另一个属性phoneNumber,它就不起作用。
  • 你是什么意思它不适用于phoneNumber? @PrafulJha
  • { "event_type" : "ABC", "user_id" : 1567221, "name" : "HGHAAAB" //这里没有蛇案例 "user_contact" : "12345678", "phoneNumber" : "91222 " } 对于这个 JSON - objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE) 不起作用
【解决方案2】:

您可以使用 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-20
    • 2015-05-27
    • 2019-06-17
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2019-11-27
    • 2021-12-19
    相关资源
    最近更新 更多