二进制编码AVRO与JSON编码AVRO的区别及Python实现咨询
Avro JSON编码规则说明
首先明确结论:Avro JSON编码和二进制编码遵循完全相同的语义规则,具体逻辑如下:
- 两者共用完全相同的JSON格式
.avscschema文件,字段类型、必填规则、默认值、联合类型等约束完全一致,不存在两套独立的语义标准 - JSON编码的载荷为纯JSON结构,所有值均按照schema定义序列化为JSON支持的格式,不存在键对应二进制值的情况,仅
bytes、fixed类型会被编码为base64格式的JSON字符串做兼容
和普通原生JSON的核心差异是:Avro JSON必须严格符合对应schema的类型约束,反序列化时也必须依赖原schema做校验,不能直接用通用JSON解析逻辑处理复杂类型(比如联合类型、枚举类型等)。
Python实现示例
Python生态常用avro库处理Avro编解码,可直接通过pip install avro安装。
1. 准备schema文件(示例:user.avsc)
{ "type": "record", "name": "User", "fields": [ {"name": "id", "type": "int"}, {"name": "name", "type": "string"}, {"name": "age", "type": ["null", "int"], "default": null}, {"name": "avatar", "type": "bytes"} ] }
2. 序列化(Python对象转Avro JSON格式)
import avro.schema from avro.io import DatumWriter, JsonEncoder import io # 加载schema schema = avro.schema.parse(open("user.avsc", "r").read()) # 测试数据 data = { "id": 1001, "name": "张三", "age": 28, "avatar": b"xxx_binary_avatar_content" } # 执行序列化 buffer = io.StringIO() writer = DatumWriter(schema) encoder = JsonEncoder(schema, buffer) writer.write(data, encoder) encoder.flush() # 输出序列化后的Avro JSON字符串 avro_json = buffer.getvalue() print(avro_json)
3. 反序列化(Avro JSON格式转Python对象)
from avro.io import DatumReader, JsonDecoder buffer = io.StringIO(avro_json) reader = DatumReader(schema) decoder = JsonDecoder(schema, buffer) parsed_data = reader.read(decoder) print(parsed_data) # 输出:{'id': 1001, 'name': '张三', 'age': 28, 'avatar': b'xxx_binary_avatar_content'}
注意事项
- 序列化、反序列化必须使用完全一致的schema,否则会触发类型校验错误
- 不要直接用
json库序列化Python字典当作Avro JSON使用,避免出现类型不符合约束的问题 bytes、fixed类型的自动base64编解码由avro库内部处理,无需额外开发
内容的提问来源于stack exchange,提问作者Rakshith Venkatesh
相关产品推荐
相关产品推荐

