首页 > 解决方案 > 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 下,一切正常:

Python2 中的输出

在 Python3 下,我收到了已建立连接的消息,并被告知收到了一条新消息,仅此而已。除此之外没有其他输出:

Python3 中的输出

环境:Raspberry Pi 3B+ 上最新版本的 Raspbian

按照建议,我替换为打印(“收到新消息”,message.payload)。message.payload 在 Python2 和 Python3 中是相同的。

Python2:

在 Python2 中打印 message.payload

Python3:

在 Python3 中打印 message.payload

谢谢!

标签: pythonjsonmqtt

解决方案


这是因为 Python3message.payload是字节数组,而 Python2 是字符串。(这可以在您发布的图像中看到,因为 Python3 字符串继续进行b'...

更改是更接近 MQTT 规范,该规范将所有 MQTT 有效负载仅视为一个集合字节,并且不对应该使用什么字符集将有效负载转换为字符串做出任何假设。

以下应该适用于 Python3(假设初始 json 是 utf-8 编码的)

dhtreadings_json = json.loads(message.payload.decode("utf-8"))

推荐阅读