【问题标题】:Python2 vs Python3 - parsing JSONPython2 与 Python3 - 解析 JSON
【发布时间】:2019-01-14 11:18:30
【问题描述】:

我尝试使用 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)。 Python2和Python3中message.payload是一样的。

Python2:

Python3:

谢谢!

【问题讨论】:

  • print(message.payload) 带给你什么?
  • 是的,将这一行 print("New message received") 更改为 print("New message received", message.payload) 并发布输出
  • @Tomalak @Alex K 正如建议的那样,我替换为打印(“收到新消息”,message.payload)。在 Python2 和 Python3 中 message.payload 是一样的。
  • 我仍然怀疑有异常被抛出。将json.loads() 放入try:/except: 块并打印任何异常。
  • 托马拉克是对的。 on_message 被称为in a try-except, and any exceptions are logged and discarded

标签: python json mqtt


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢!您的解决方案在 Python2 和 Python3 中也能完美运行!
猜你喜欢
  • 2019-10-14
  • 2017-07-07
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 2016-06-19
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多