python - Python2 与 Python3 - 解析 JSON
问题描述
我尝试使用 Python 读取 MQTT 消息。出于调试目的,我至少减少了程序。
import paho.mqtt.client as mqtt
import json
def on_connect(client, userdata, flags, rc):
print("Connected with code " + str(rc))
client.subscribe("temperature")
def on_message(client, userdata, message):
if message.topic == "temperature":
print("New message received")
dhtreadings_json = json.loads(message.payload)
temperature = dhtreadings_json['temperature']
print(temperature)
mqttc = mqtt.Client()
mqttc.username_pw_set("user","password")
mqttc.on_connect = on_connect
mqttc.on_message = on_message
mqttc.connect("192.168.1.133",1883,60)
mqttc.loop_forever()
在 Python 2 下,一切正常:
在 Python3 下,我收到了已建立连接的消息,并被告知收到了一条新消息,仅此而已。除此之外没有其他输出:
环境:Raspberry Pi 3B+ 上最新版本的 Raspbian
按照建议,我替换为打印(“收到新消息”,message.payload)。message.payload 在 Python2 和 Python3 中是相同的。
Python2:
Python3:
谢谢!
解决方案
这是因为 Python3message.payload
是字节数组,而 Python2 是字符串。(这可以在您发布的图像中看到,因为 Python3 字符串继续进行b'...
)
更改是更接近 MQTT 规范,该规范将所有 MQTT 有效负载仅视为一个集合字节,并且不对应该使用什么字符集将有效负载转换为字符串做出任何假设。
以下应该适用于 Python3(假设初始 json 是 utf-8 编码的)
dhtreadings_json = json.loads(message.payload.decode("utf-8"))
推荐阅读
- reactjs - 反应:网址改变,但页面永远不会移动
- typescript - 为什么我的类方法无法从其接口获取参数类型?
- java - 随着 JDialog 大小的变化,如何让 JLabel 始终停靠在 GridBagLayout 的左侧?
- python - 正则表达式删除以特定符号等开头的所有行
- azure-devops - Azure Devops Build - 当特定的 nuget 包版本不存在时想要失败
- ruby-on-rails - 高级调度程序 rake 任务在 sleep 命令期间中止
- python - 为什么我的代理仍然转发我的个人 IP 地址?
- php - PHP 8.0 Curl 请求正在运行,但在日志中生成致命错误
- java - 如何创建以操作系统名称为参数的函数
- php - 如何更正 postgresql 数据库中 PDO php 的强制转换问题