首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试解析可为空的字段时获取AvroTypeException

尝试解析可为空的字段时获取AvroTypeException
EN

Stack Overflow用户
提问于 2021-11-30 14:02:02
回答 1查看 38关注 0票数 0

我从调用/subjects/{subject}/versions/latest的Kafka schema Registry API获取avro模式,其中有一个"type":["null","string"]字段

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

代码语言:javascript
复制
JsonDecoder jsonDecoder = DecoderFactory.get().jsonDecoder(schema, body);
DatumReader<Object> reader = new GenericDatumReader<>(schema);

变量body有一个jsonString,其中包含模式中的所有字段,包括可选字段...

但是,当我调用reader.read(null, jsonDecoder);时,我得到了一个带有以下消息的AvroTypeExceptionorg.apache.avro.AvroTypeException: Expected start-union. Got END_OBJECT

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

有没有什么配置是我搞错了?

模式:

代码语言:javascript
复制
{
    "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"
            ]
        }
    ]
}

body变量:

代码语言:javascript
复制
{
    "field1":"value1"
}

代码语言:javascript
复制
{
    "field1":"value1",
    "field2":"value2"
}
EN

回答 1

Stack Overflow用户

发布于 2021-12-01 15:31:58

对于示例主体,如下所示:

代码语言:javascript
复制
{"field1":"value1"}

Java JSON解码器目前不能处理缺少字段的情况(即使它有默认值)。因为JAVA JSON编码器总是写出字段,所以解码器总是希望字段在那里。

对于第二个示例,它看起来像这样:

代码语言:javascript
复制
{"field1":"value1", "field2":"value2"}

这不是有效的JSON编码的Avro数据。我猜这是一种数据结构,它是由Avro编码器以外的其他方法创建的,因为Avro编码器会创建以下内容:

代码语言:javascript
复制
{"field1":"value1", "field2": {"string": "value2"}}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70170630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档