我从调用/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"
]
}
]
}body变量:
{
"field1":"value1"
}或
{
"field1":"value1",
"field2":"value2"
}发布于 2021-12-01 15:31:58
对于示例主体,如下所示:
{"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
https://stackoverflow.com/questions/70170630
复制相似问题