AVRO Schema可选值验证失败:字符串值无法通过校验
AVRO Schema 校验失败原因及解决办法
问题核心在于AVRO联合类型的JSON编码规则:
你定义的appId字段是["null", "string"]的联合类型,AVRO对这种类型的JSON数据有明确要求:
- 当值为
null时,可直接写null(这就是第一份数据能通过校验的原因) - 当值为非null的类型(比如字符串)时,必须用类型名称作为键的对象包裹对应的值
你提供的第二份数据直接将字符串赋值给appId,不符合AVRO的JSON编码规范,因此校验失败。
正确的可校验通过数据示例
{ "eventName": "active-app-selected", "eventData": { "appId": { "string": "any string" } } }
额外优化方案
如果希望避免这种包装式写法,你可以修改Schema,去掉联合类型,直接将appId的类型设为string并指定default: null——AVRO允许基础类型设置默认null值,这样就可以直接写字符串或null:
{ "type": "record", "name": "SelectActiveApp", "fields": [ { "name": "eventName", "type": "string" }, { "name": "eventData", "type": { "type": "record", "name": "EventData", "fields": [ { "name": "appId", "type": "string", "default": null } ] } } ] }
内容的提问来源于stack exchange,提问作者DxW
相关产品推荐
相关产品推荐

