Python 如何从mqtt消息反序列化avro数据?
我正在以mqtt消息的形式接收序列化(AVRO)数据消息看起来像这样Objavro.codecnullavro.schema:{“类型”:“记录”,“名称”:“用户”,“命名空间”:“示例.avro”,“字段”:[{“类型”:“字符串”,“名称”:“名称”},{“类型”:[“int”,“null”],“名称”:“收藏夹编号”},{“类型”:[“字符串”,“null”],“名称”:“收藏夹J@xX·,Alyssa€Ben redŒpq+±)žJ@xX· 我必须使用已知模式的Python3user.avsc对这些数据进行反序列化-Python 如何从mqtt消息反序列化avro数据?,python,mqtt,avro,Python,Mqtt,Avro,我正在以mqtt消息的形式接收序列化(AVRO)数据消息看起来像这样Objavro.codecnullavro.schema:{“类型”:“记录”,“名称”:“用户”,“命名空间”:“示例.avro”,“字段”:[{“类型”:“字符串”,“名称”:“名称”},{“类型”:[“int”,“null”],“名称”:“收藏夹编号”},{“类型”:[“字符串”,“null”],“名称”:“收藏夹J@xX·,Alyssa€Ben redŒpq+±)žJ@xX· 我必须使用已知模式的Python3user.
{"namespace": "example.avro",
"type": "record",
"name": "User",
"fields": [
{"name": "name", "type": "string"},
{"name": "favorite_number", "type": ["int", "null"]},
{"name": "favorite_color", "type": ["string", "null"]}
]
}
反序列化的数据应该如下所示
{u'favorite_color': None, u'favorite_number': 256, u'name': u'Alyssa'}
{u'favorite_color': u'red', u'favorite_number': 7, u'name': u'Ben'}
在给出的示例中,数据是从DataFileWriter/Reader方法写入/读取的,但是,当消息到达时,python代码会对数据进行反序列化并打印它,这将是非常棒的
MQTT订阅逻辑已经被处理,现在它只打印传入消息,我想打印带有传入消息的反序列化数据
我尝试了以下(反序列化逻辑):
上述代码失败(TypeError:ord()应为字符,但找到长度为0的字符串),因为我无法找到用作reader.read()方法参数的正确格式。我使用io.BytesIO的原因是因为数据以字符串的形式到达,所以我无法传递字符串,显然apache页面中的示例读取二进制格式的数据,并将其用于反序列化
谢谢如果您从MQTT获得的消息是字符串格式(而不是字节),那么您可能无法对其进行反序列化。如果您看到的是字符串格式的avro二进制文件,您将无法将其编码为UTF-8并反序列化。您需要实际的二进制文件。如果从MQTT获得的消息是字符串格式(而不是字节),那么您可能无法对其进行反序列化。如果您看到的是字符串格式的avro二进制文件,您将无法将其编码为UTF-8并反序列化。您需要实际的二进制文件
import avro.schema
from avro.io import DatumReader, DatumWriter
import io
schema = avro.schema.parse(open("user.avsc", "rb").read())
# message passed here is incoming message
bytes_reader = io.BytesIO(bytes(message, encoding='utf-8'))
decoder = avro.io.BinaryDecoder(bytes_reader)
reader = avro.io.DatumReader(schema)
data = reader.read(decoder)
print(data)