Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从mqtt消息反序列化avro数据?_Python_Mqtt_Avro - Fatal编程技术网

Python 如何从mqtt消息反序列化avro数据?

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.

我正在以mqtt消息的形式接收序列化(AVRO)数据消息看起来像这样Objavro.codecnullavro.schema:{“类型”:“记录”,“名称”:“用户”,“命名空间”:“示例.avro”,“字段”:[{“类型”:“字符串”,“名称”:“名称”},{“类型”:[“int”,“null”],“名称”:“收藏夹编号”},{“类型”:[“字符串”,“null”],“名称”:“收藏夹J@xX·,Alyssa€Ben redŒpq+±)žJ@xX·

我必须使用已知模式的Python3user.avsc对这些数据进行反序列化-

{"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)