【问题标题】:Any ideas how to parse this payload in python?任何想法如何在 python 中解析这个有效载荷?
【发布时间】:2016-07-28 04:00:47
【问题描述】:

我正在使用 MQTT 订阅主题并接收消息。到目前为止,我已经编写了这段代码,并且它可以正常订阅,但是我在确定解析从 MQTT 代理接收到的有效负载的方法时遇到了问题。我一直在尝试获取我在有效负载中看到的数值,但我无法找出解析这些数据的正确方法。有什么想法/建议吗?谢谢!

我的代码:

还有更多不相关的代码。这只是一个sn-p。

import paho.mqtt.client as mqtt
import json

#Call back functions 

# gives connection message
def on_connect(client,userdata,rc):
print("Connected with result code:"+str(rc))
# subscribe for all devices of user
client.subscribe('+/devices/+/up')

def on_connect(client,userdata,rc):
print("Connected with result code:"+str(rc))
# subscribe for all devices of user
client.subscribe('+/devices/+/up')

def on_message(client,userdata,msg):
print"Topic",msg.topic + "\nMessage:" + str(msg.payload)

node_data = str(msg.payload)
print '\r\n test'
print node_data

j = json.loads(node_data)
print "\r\n after loads: "
print j

我的输出

Message:{"payload":"Dgv+CggGBCYFAPMLAgc=","fields":{"Light":58.32,"Pressure":98569.5,"Temp":32.4375,"X_accel":0.6875,"Y_accel":-0.125,"Z_accel":0.625},"port":1,"counter":8,"dev_eui":"000000007D9050C1","metadata":[{"frequency":904.3,"datarate":"SF7BW125","codingrate":"4/5","gateway_timestamp":2090979635,"gateway_time":"2016-07-28T02:26:15.386371Z","channel":2,"server_time":"2016-07-28T02:06:13.075194806Z","rssi":-13,"lsnr":9.5,"rfchain":0,"crc":1,"modulation":"LORA","gateway_eui":"0080000000009BE6","altitude":911,"longitude":-93.19677,"latitude":45.10303}]}


 test
{"payload":"Dgv+CggGBCYFAPMLAgc=","fields":{"Light":58.32,"Pressure":98569.5,"Temp":32.4375,"X_accel":0.6875,"Y_accel":-0.125,"Z_accel":0.625},"port":1,"counter":8,"dev_eui":"000000007D9050C1","metadata":[{"frequency":904.3,"datarate":"SF7BW125","codingrate":"4/5","gateway_timestamp":2090979635,"gateway_time":"2016-07-28T02:26:15.386371Z","channel":2,"server_time":"2016-07-28T02:06:13.075194806Z","rssi":-13,"lsnr":9.5,"rfchain":0,"crc":1,"modulation":"LORA","gateway_eui":"0080000000009BE6","altitude":911,"longitude":-93.19677,"latitude":45.10303}]}


 after loads: 
{u'fields': {u'Y_accel': -0.125, u'Temp': 32.4375, u'X_accel': 0.6875, u'Light': 58.32, u'Pressure': 98569.5, u'Z_accel': 0.625}, u'counter': 8, u'port': 1, u'dev_eui': u'000000007D9050C1', u'payload': u'Dgv+CggGBCYFAPMLAgc=', u'metadata': [{u'gateway_time': u'2016-07-28T02:26:15.386371Z', u'server_time': u'2016-07-28T02:06:13.075194806Z', u'datarate': u'SF7BW125', u'gateway_eui': u'0080000000009BE6', u'modulation': u'LORA', u'gateway_timestamp': 2090979635, u'longitude': -93.19677, u'crc': 1, u'frequency': 904.3, u'rfchain': 0, u'codingrate': u'4/5', u'lsnr': 9.5, u'latitude': 45.10303, u'rssi': -13, u'altitude': 911, u'channel': 2}]}

我希望能够从这个...字符串中提取数值?字典?Json?(有效负载)用于“温度”、“光”、“压力”等...参数。任何建议都非常重要赞赏。 我尝试了以下方法,但收到此错误。没有告诉我太多...

data = json.loads(node_data)
Press = data['Pressure']
print Press

文件“C:\Python27\My_Py_27_Codes\scratch_py_mqtt.py”,第 25 行,on_message Press = data['压力']

KeyError: 'Pressure'

显然“压力”不是本词典中的关键字?

【问题讨论】:

  • Press = data["fields"]['Pressure']
  • 试试data['fields']['Pressure']
  • 您必须提供该字段的确切位置。在您的情况下,“压力”在“字段”内
  • 压力是一本字典的关键……只是不是顶级

标签: python json parsing data-structures iot


【解决方案1】:
node_data  = {"payload":"dsgsg","fields":{"pressure":34,"temp":35}}
data = json.loads(node_data)
Press = data['fields']['Pressure']
print Press

您必须提供文件的确切位置。在您的情况下,pressurefields 字典中

【讨论】:

  • 是的,我猜我不熟悉这个话题。一旦我意识到我确实在使用“字典”,这很容易解决。在阅读您的评论之前,我解决了自己的问题,但我可以看到您是正确的。感谢您的帮助和慷慨的建议。干杯!
【解决方案2】:

所以经过几个小时的挠头和“编码”之后,我设法实现了我的目标。我不确定这是否是“最漂亮”的方式,或者它是否是最好的方式,但这是我想出的:我正在处理一个“字典”,我必须选择适当的键名“字段” '。这将使我能够“获取”与字典“字段”部分内的参数(温度、压力、光照等)相关的数值。

解决我的问题的代码:

def on_message(client,userdata,msg):
print"Topic",msg.topic + "\n\nMessage:" + str(msg.payload)

node_data = str(msg.payload)

print ' \n Sensor Values \r'

my_dict = json.loads(node_data)
params = my_dict.get("fields",None)

light = params.get('Light')
pressure = params.get('Pressure')
temp = params.get('Temp')
x = params.get('X_accel')
y = params.get('Y_accel')
z = params.get('Z_accel')

print ''
print 'Light:' + str(light)
print 'Pressure:' + str(pressure)
print 'Temperature:' + str(temp)
print 'X-accel:' + str(x)
print 'Y-accel:' + str(y)
print 'Z-accel:' + str(z)
print '\n\n'

大家干杯!

【讨论】:

  • 因为params = my_dict.get("fields",None)这一行之后的所有代码都使用params作为字典,一个更好的默认值是params = my_dict.get("fields",{})
猜你喜欢
  • 1970-01-01
  • 2020-04-26
  • 2020-04-21
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2012-03-16
  • 1970-01-01
相关资源
最近更新 更多