尝试解析可为空的字段时出现 AvroTypeException

Posted

技术标签:

【中文标题】尝试解析可为空的字段时出现 AvroTypeException【英文标题】:Getting AvroTypeException when try parse nullable fields 【发布时间】:2022-01-07 05:50:21 【问题描述】:

我从调用 /subjects/subject/versions/latest 的 Kafka Schema Registry API 获取我的 avro 架构,并且有一个 "type":["null","string"] 字段

我用这个模式创建了一个新的 JsonDecoder 和 DatumReader:

JsonDecoder jsonDecoder = DecoderFactory.get().jsonDecoder(schema, body);
DatumReader<Object> reader = new GenericDatumReader<>(schema);

变量body 有一个jsonString,包含架构中的所有字段,包括可选字段...

但是,当我致电 reader.read(null, jsonDecoder); 时,我收到了 AvroTypeException 的消息:org.apache.avro.AvroTypeException: Expected start-union. Got END_OBJECT

如果body 没有该字段,也会发生同样的情况...

是否有一些我错过的配置?

架构:


    "type":"record",
    "name":"evolution",
    "namespace":"com.landoop",
    "doc":"This is a sample Avro schema to get you started. Please edit",
    "fields":[
        
            "name":"field1",
            "type":"string"
        ,
            "name":"field2",
            "type": [
                "null",
                "string"
            ]
        
    ]

主体变量:


    "field1":"value1"


    "field1":"value1",
    "field2":"value2"

【问题讨论】:

你能发布完整的架构和完整的body 数据吗? 如果您获得了CachedSchemaRegistryClient 的Java 依赖项,那么它有方法可以为您获得Avro Schema 类。然后你就不需要手动下载和解析 AVSC json body 【参考方案1】:

对于如下所示的示例正文:

"field1":"value1"

Java JSON 解码器目前不处理缺少字段的情况(即使它具有默认值)。由于 JAVA JSON 编码器总是写出该字段,因此解码器总是希望该字段存在。

第二个示例如下所示:

"field1":"value1", "field2":"value2"

这是无效的 JSON 编码 Avro 数据。我猜这是一个由 Avro 编码器以外的其他方式创建的数据结构,因为 Avro 编码器会创建这个:

"field1":"value1", "field2": "string": "value2"

规范描述了 JSON 编码在联合的情况下是如何工作的,如果值为非空,那么它将对类型信息进行编码:https://avro.apache.org/docs/current/spec.html#json_encoding

【讨论】:

以上是关于尝试解析可为空的字段时出现 AvroTypeException的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串解析为可为空的 int

JPA 可嵌入 PK 和可为空的字段

为啥我不能将 DBNull.Value 插入到 sql server 2005 中的可为空的图像字段中?

尝试访问不为空的 Java ArrayList<User> 时出现 NullPointer

在 Typescript 中将可为空的对象值转换为字符串

如何使用 typeorm 将可为空的数据库字段设置为 NULL?