Python:如何从UDP接收的数据包中获取JSON对象

Python:如何从UDP接收的数据包中获取JSON对象,python,json,sockets,networking,Python,Json,Sockets,Networking,我正在通过网络使用UDP数据包发送此温度和湿度读数。由于UDP只接受1个参数,所以我将它们放入一个JSON对象,然后放入一个字符串。当我收到数据包时,我似乎无法从收到的数据包中得到我想要的值 #!/usr/bin/python import sys import time import socket import Adafruit_DHT import json UDP_IP = "192.168.42.18" PORT = 5001 my_ip = socket.gethostbyname

我正在通过网络使用UDP数据包发送此温度和湿度读数。由于UDP只接受1个参数,所以我将它们放入一个JSON对象,然后放入一个字符串。当我收到数据包时,我似乎无法从收到的数据包中得到我想要的值

#!/usr/bin/python
import sys
import time
import socket
import Adafruit_DHT
import json

UDP_IP = "192.168.42.18"
PORT = 5001

my_ip = socket.gethostbyname(socket.getfqdn())

print "server has started",


while True:
   humidity, temperature = Adafruit_DHT.read_retry(11, 4)#initialising DHT11 temp sensor

   print 'Temp: {0:0.1f} C  Humidity: {1:0.1f} %'.format(temperature, humidity)
   print time.asctime()#printing to the terminal values

   json_string = {}
   json_string ['details'] = {'ip': my_ip, 'temp':temperature,  'humidity':humidity}

   sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)#initalising socket and UDP connection
   Message = str(json_string)
   print 'Message sent:= ', Message

   sock.sendto(Message,(UDP_IP, PORT))
   print "SENT to:-", UDP_IP, PORT, "From", my_ip

   time.sleep(3)#delay
接收代码

import socket
import time
import json

port = 5001

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

sock.bind(("", port))

print "server started"

while True:
   recieved = sock.recvfrom(1024)
   print type(recieved)
   print recieved[0]
   print time.asctime()#bytes object


   json_obj = json.dumps(recieved)

   print type(json_obj)

   print json_obj ['details']['temp']

#json_converted = json.loads(json_obj)
#print type(json_converted)

#json_string = map(str,(json_converted))

   print "converted Json:- "
#print json_string['details']['temp']
   print "Temperature in Celsuius"
我不断收到错误格式的错误。正确的方法是什么

server started
<type 'tuple'>
{'details': {'ip': '127.0.1.1', 'temp': 20.0, 'humidity': 49.0}}
Wed Feb 22 16:27:06 2017
<type 'str'>
Traceback (most recent call last):
File "/Users/Faiz/Desktop/Rpi_Sensors_UDP/sensor_listenerUDP.py", line 24, in     <module>
 print json_obj ['details']['temp']
 TypeError: string indices must be integers, not str

Process finished with exit code 1
服务器已启动
{'details':{'ip':'127.0.1.1','temp':20.0','湿度]:49.0}
2017年2月22日星期三16:27:06
回溯(最近一次呼叫最后一次):
文件“/Users/Faiz/Desktop/Rpi_Sensors_UDP/sensor_listenerUDP.py”,第24行,在
打印json_obj['details']['temp']
TypeError:字符串索引必须是整数,而不是str
进程已完成,退出代码为1

json_obj = json.loads(recieved[0])
而不是

json_obj = json.dumps(recieved)
loads将把你收到的字符串转换成dict,然后你就可以得到你的数据了

像这样

import socket
import time
import json

port = 5001

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

sock.bind(("", port))

print "server started"

while True:
   recieved = sock.recvfrom(1024)
   print type(recieved)
   print recieved[0]
   print time.asctime()#bytes object


   json_obj = json.loads(recieved[0])

   print type(json_obj)

   print json_obj.get('details').get('temp') 

#json_converted = json.loads(json_obj)
#print type(json_converted)

#json_string = map(str,(json_converted))

   print "converted Json:- "
#print json_string['details']['temp']
   print "Temperature in Celsuius"

如下所示,在recieve中使用json.load(recieved[0]),并使用json.dump从json创建字符串

#!/usr/bin/python
import sys
import time
import socket
import Adafruit_DHT
import json

UDP_IP = "192.168.43.113"
PORT = 5001

my_ip = socket.gethostbyname(socket.getfqdn())

print "server has started",

while True:
    humidity, temperature = Adafruit_DHT.read_retry(11, 4)#initialising DHT11 temp sensor

    print 'Temp: {0:0.1f} C  Humidity: {1:0.1f} %'.format(temperature, humidity)
    print time.asctime()#printing to the terminal values


    json_string = json.dumps({"ip": my_ip, "temp": temperature, "humidity": humidity})
    #here put the created JSON into a string using json.dumps also checked the JSON string for validity using jsonlint.


    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)#initalising socket and UDP connection

    Message = json_string
    print 'Message sent:= ', Message

    sock.sendto(Message,(UDP_IP, PORT))
    print "SENT to:-", UDP_IP, PORT, "From", my_ip

    time.sleep(3)#delay 5 mins

ValueError:应为属性名:第1行第2列(字符1)是我得到的错误。上面说在第19行