Avro union-类型信息在结果json中

时间:2018-11-15 17:20:22

标签: java apache-kafka avro confluent confluent-schema-registry

我有一部分Java应用程序,它将AVRO编码的对象写入Kafka主题。我使用org.apache.kafka.clients.producer.Producer将消息发送到主题。生产者配置为使用io.confluent.kafka.serializers.KafkaAvroSerializer

AVRO模式除其他外包含以下字段:

{
  "name": "field1",
  "type": [
    "null",
    "string"
  ],
  "default": null
}

这基本上意味着它是一个字符串字段,可以为空。

将对象发送给主题之后,我使用以下终端命令检查其内容:

./kafka-avro-console-consumer --bootstrap-server broker-host:9091 --topic test-topic-1
  --property schema.registry.url=http://schema-host:8081 --from-beginning

作为结果,我希望看到一个具有以下属性的JSON:

{"field1": "something"}

但是,实际上我看到了:

{"field1": {"string": "something"}}

此外,如果我在扩展toString()的对象上简单地使用SpecificRecordBase方法,然后再将其实际发送到主题,则会看到JSON的格式符合预期。

是否有一种方法可以真正获得主题中的第一个选项,而无需将这些额外的类型信息作为JSON的一部分?

1 个答案:

答案 0 :(得分:0)

  

是否有一种方法可以真正获得主题中的第一个选项,而无需将这些额外的类型信息作为JSON的一部分?

没有avro-console-consumer。它使用的是GenericRecord,而不是SpecificRecord

由于该字段是联合类型,因此Avro Record JSON编码的输出必须包括该值的字段type