Python 3 Paho-MQTT Published/Subscribed JSON 消息将不会被解析
Python 3 Paho-MQTT Published/Subscribed JSON message won't parse
这里是菜鸟。
我有一个简单的 python 代码,它应该订阅一个主题并使用 MQTT 协议将 JSON 有效负载发布到同一主题。但出于某种原因,我无法将负载加载为 JSON!
我做错了什么?
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
import json
mqtt_broker = '192.168.1.111'
mqtt_topic_one = 'mqtt_topic/tops_one'
mqtt_topic_two = 'mqtt_topic/tops_two'
json_data_1 = '''{
"this_json": "info",
"data": {
"multi_keyval": {
"1": "1",
"5": "5",
"15": "15"
},
"single_keyval": {
"single_key": "200"
}
}
}'''
def pass_to_func_and_pub(data_to_pub):
print(data_to_pub) # --------> This PRINTS
print(json.loads(data_to_pub)) # --------> This DOES NOT PRINT
# The following two lines don't work either.
unpacked_json = json.loads(data_to_pub)
client.publish(mqtt_topic_two, unpacked_json['this_json'])
def on_connect(client, userdata, flags, rc):
client.subscribe(mqtt_topic_one)
client.publish(mqtt_topic_one, json_data_1)
def on_message(client, userdata, msg):
pass_to_func_and_pub(str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(mqtt_broker)
try:
client.loop_forever()
except KeyboardInterrupt:
client.disconnect()
print('MQTT client disconnected, exiting now.')
这里有几个问题。
1。异常处理
你没有处理异常(我猜 Paho 在处理程序中有效地忽略了它们,以保持客户端存活)。这意味着当 是 在 json.loads(data_to_pub)
中抛出的异常时,您永远不会看到它,但是由于没有本地 except
块而退出函数。
改进版
def pass_to_func_and_pub(data_to_pub):
print("Raw data: ", data_to_pub)
try:
unpacked_json = json.loads(data_to_pub)
except Exception as e:
print("Couldn't parse raw data: %s" % data_to_pub, e)
else:
print("JSON:", unpacked_json)
client.publish(mqtt_topic_two, unpacked_json['this_json'])
等等,什么异常?
运行我们现在可以看到的这个改进版本:
Couldn't parse raw data: b'{\n "this_json": "info",\n "data": {\n "multi_keyval": {\n "1": "1",\n "5": "5",\n "15": "15"\n },\n "single_keyval": {\n "single_key": "200"\n }\n }\n}' Expecting value: line 1 column 1 (char 0)
嗯,那个 b'
在那里做什么?...
2。编码问题
基本上你的问题归结为一行
def on_message(client, userdata, msg):
pass_to_func_and_pub(str(msg.payload))
通过在 MqttMessage
的 payload
上调用 str
,它是 [=66 中的 bytes
对象 =] 3,你会得到这些字节的字符串化版本,例如b'foobar'
.
当然,这个 b
现在使它无效 JSON,因此 Expecting value: line 1 column 1 (char 0)
...
固定版本
不要打电话给str
! Json.loads can handle bytes
too。所以:
def on_message(client, userdata, msg):
pass_to_func_and_pub(msg.payload)
或者,假设使用 utf-8 编码,我们可以更明确地执行此操作(我更喜欢使用字符串):
def on_message(client, userdata, msg):
pass_to_func_and_pub(msg.payload.decode('utf-8'))
希望对您有所帮助!
这里是菜鸟。
我有一个简单的 python 代码,它应该订阅一个主题并使用 MQTT 协议将 JSON 有效负载发布到同一主题。但出于某种原因,我无法将负载加载为 JSON!
我做错了什么?
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
import json
mqtt_broker = '192.168.1.111'
mqtt_topic_one = 'mqtt_topic/tops_one'
mqtt_topic_two = 'mqtt_topic/tops_two'
json_data_1 = '''{
"this_json": "info",
"data": {
"multi_keyval": {
"1": "1",
"5": "5",
"15": "15"
},
"single_keyval": {
"single_key": "200"
}
}
}'''
def pass_to_func_and_pub(data_to_pub):
print(data_to_pub) # --------> This PRINTS
print(json.loads(data_to_pub)) # --------> This DOES NOT PRINT
# The following two lines don't work either.
unpacked_json = json.loads(data_to_pub)
client.publish(mqtt_topic_two, unpacked_json['this_json'])
def on_connect(client, userdata, flags, rc):
client.subscribe(mqtt_topic_one)
client.publish(mqtt_topic_one, json_data_1)
def on_message(client, userdata, msg):
pass_to_func_and_pub(str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(mqtt_broker)
try:
client.loop_forever()
except KeyboardInterrupt:
client.disconnect()
print('MQTT client disconnected, exiting now.')
这里有几个问题。
1。异常处理
你没有处理异常(我猜 Paho 在处理程序中有效地忽略了它们,以保持客户端存活)。这意味着当 是 在 json.loads(data_to_pub)
中抛出的异常时,您永远不会看到它,但是由于没有本地 except
块而退出函数。
改进版
def pass_to_func_and_pub(data_to_pub):
print("Raw data: ", data_to_pub)
try:
unpacked_json = json.loads(data_to_pub)
except Exception as e:
print("Couldn't parse raw data: %s" % data_to_pub, e)
else:
print("JSON:", unpacked_json)
client.publish(mqtt_topic_two, unpacked_json['this_json'])
等等,什么异常?
运行我们现在可以看到的这个改进版本:
Couldn't parse raw data: b'{\n "this_json": "info",\n "data": {\n "multi_keyval": {\n "1": "1",\n "5": "5",\n "15": "15"\n },\n "single_keyval": {\n "single_key": "200"\n }\n }\n}' Expecting value: line 1 column 1 (char 0)
嗯,那个 b'
在那里做什么?...
2。编码问题
基本上你的问题归结为一行
def on_message(client, userdata, msg):
pass_to_func_and_pub(str(msg.payload))
通过在 MqttMessage
的 payload
上调用 str
,它是 [=66 中的 bytes
对象 =] 3,你会得到这些字节的字符串化版本,例如b'foobar'
.
当然,这个 b
现在使它无效 JSON,因此 Expecting value: line 1 column 1 (char 0)
...
固定版本
不要打电话给str
! Json.loads can handle bytes
too。所以:
def on_message(client, userdata, msg):
pass_to_func_and_pub(msg.payload)
或者,假设使用 utf-8 编码,我们可以更明确地执行此操作(我更喜欢使用字符串):
def on_message(client, userdata, msg):
pass_to_func_and_pub(msg.payload.decode('utf-8'))
希望对您有所帮助!