Python2 vs Python3-解析JSON

时间:2019-01-14 11:18:31

标签: python json mqtt

我尝试使用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下,一切正常:

Output in Python2

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

Output in Python3

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

根据建议,我将其替换打印(“收到新消息”,message.payload)。 message.payload在Python2和Python3中相同。

Python2:

Print message.payload in Python2

Python3:

Print message.payload in Python3

谢谢!

1 个答案:

答案 0 :(得分:2)

这是因为在Python3中,message.payload是字节数组,而在Python2中,则是字符串。 (这可以在您发布的图像中看到,因为Python3字符串以b'...开头)

更改是为了更接近MQTT规范,该规范将所有MQTT有效载荷视为一个收集字节,并且也没有对应该使用什么字符集将有效载荷隐蔽到字符串进行任何假设。

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

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