我在这方面花了太多时间但却无法理解。我有一个arduino将json字符串写入串口。字符串如下所示:{“temp”:“69”,“light”:“141”,“z”:“999”}并验证为有效的json。我试图使用以下python脚本从串口读取并打印出json字符串的各种值。
import serial
import json
serial = serial.Serial("/dev/ttyUSB0", 9600, timeout=1)
while True:
data = serial.readline().strip('\n\r')
j = json.loads(data)
print(data)
print j['temp']
无论我尝试更改什么,我最终会收到此错误消息:无法解码JSON对象。然而,这完美无缺:
import json
data = '{"temp":"95","light":"200","z":"999"}'
j = json.loads(data)
print(data)
print j['temp']
任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
因为您为串行对象指定了(读取)超时,所以readline
方法如果在达到超时之前找不到\n
,则可能返回空字符串。这确实会导致您所描述的错误:
In [18]: import json
In [19]: json.loads('')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
[ stripping extra output - merely an example ]
ValueError: No JSON object could be decoded
确保您的Arduino正在发送以换行符结尾的字符流。如果您的Arduino代码使用Serial.println(yourJSONdata)
代替Serial.print(val)
,则应自动处理。
或者,一次解析串行输入缓冲区一个字符(Serial.read(1)
),例如这样(注释:效率不高):
input = [' ']
while input[-1] != '}':
input.append(serial.read(1))
data = ''.join(input)
j = json.loads(data)
现在不需要发送换行符。 请注意,如果嵌套字典,此代码将失败,在这种情况下,您需要跟踪嵌套级别。看看你的Arduino返回字符串的内容,我想你正在读出简单的传感器数据,在这种情况下,单个嵌套级别可能已经足够了。
另外,我认为将模块名称用作变量是不好的形式,从而使其无法访问。您可以在案例中使用from serial import Serial
。
答案 1 :(得分:0)
首先,您必须使用“点编码()”方法将接收到的字节转换为字符串,然后继续处理json数据