尝试解析可为空的字段时出现 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的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能将 DBNull.Value 插入到 sql server 2005 中的可为空的图像字段中?