You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Avro 1.8.2 Schema可选字段缺失抛出AvroTypeException异常问题

Avro 1.8.2 可选字段缺失时解析抛出AvroTypeException问题

使用Avro 1.8.2版本处理Avro消息时存在运行异常:当输入的JSON消息缺失Schema中已声明为可选的字段时,解析流程无法正常执行,抛出异常:
org.apache.avro.AvroTypeException: Expected field name not found: username

复现步骤

  • 步骤1:创建JSON文件test.json,文件中缺失username字段,内容如下:
{
   "tweet":"Simple message.",
   "timestamp":7866844999
}
  • 步骤2:创建Schema定义文件schema.avsc,其中username字段被声明为可选类型,内容如下:
{
   "type":"record",
   "name":"test_schema",
   "namespace":"com.test.avro",
   "fields":[
      {
         "name":"username",
         "type":[
            "null",
            "string"
         ],
         "default":null,
         "doc":"doc 1"
      },
      {
         "name":"tweet",
         "type":"string",
         "doc":"doc 2"
      },
      {
         "name":"timestamp",
         "type":"long",
         "doc":"doc 3"
      }
   ],
   "doc:":"A basic schema"
}
  • 步骤3:下载对应版本的avro-tools jar包,执行以下命令即可复现异常:
java -jar avro-tools-1.8.2.jar fromjson --schema-file schema.avsc test.json

问题原因

这是Avro 1.8.2版本自带的已知缺陷:该版本的JSON解析逻辑没有做默认值自动填充的处理,哪怕字段声明为可选类型、且配置了null默认值,只要输入JSON里没显式传这个字段,解析器就会直接抛字段不存在的类型错误,根本不会读取Schema中配置的默认值补全字段。

解决方法

  • 最省事的方案是直接把Avro升级到1.9.0及以上版本,高版本已经修复了这个解析逻辑问题,执行相同的fromjson命令时,会自动为缺失的可选字段填充配置的默认值,可正常完成解析。
  • 若项目依赖锁死必须使用1.8.2版本,就不要直接用avro-tools的fromjson命令,自行编写解析逻辑:反序列化前先校验输入JSON的字段集合,对缺失的、配置了默认值的字段手动补入对应默认值后,再走Avro反序列化流程即可。

内容的提问来源于stack exchange,提问作者lalit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:48:36