2016-07-02 90 views
0

我想使用ijson从串口读取对象。我可以从端口读取罚款,我可以使用ijson反序列化流中的对象,但从串行端口使用ijson只是不枚举任何东西。从串口读取json对象

这是我的代码示例:

self.serial_port = serial.Serial(
     port=self.port_name, \ 
     baudrate=115200, \ 
     parity=serial.PARITY_NONE, \ 
     stopbits=serial.STOPBITS_ONE, \ 
     bytesize=serial.EIGHTBITS, \ 
     timeout=None) 
    print 'start reading' 
    parser = ijson.parse(self.serial_port) 

    for prefix, event, value in parser: 
     print `value` 
    print 'stop reading' 

和我的输出就是

start reading 

回答

1

尝试这样做:

import ijson 
import sys 
for x in ijson.parse(sys.stdin): 
    print(x) 

您可以输入JSON,但没有将打印直到你按下Ctrl-D两次来表示stdin的结束。我没有测试过它,但我怀疑你的串行端口发生了类似的事情:因为你的串行端口从不关闭,ijson不知道何时开始分析。根据您的串行库,我会尝试将EOF或EOT字符发送给python,或者单独寻找一种方法使其触发流的结束。

一些选项我能想到:

  • 从ijson分别读取一行,然后分析它
  • 设置超时或inter_byte_timeout只从流中读取JSON的第一段
+0

感谢丹尼斯。但我不能依赖EOS/EOT,因为我打算保留流式传输对象。好的建议,但。解决方案只是将缓冲区大小降至1。 – Adam

0

好吧,我想通了。你必须缓冲区的大小设置为1 所以,这个工程......

objects = ijson.common.items(ijson.parse(self.serial_port, buf_size=1), 'item') 
    for o in objects: 
     print `o` 

我的目标是能够接收对象的络绎不绝。我用“[”来表示流的开始,然后发送逗号分隔的json对象列表,并用“]”结束列表。每当数组中的对象完成时,迭代器就会循环。

完美地工作。

测试通过发送这个(在对象的中间故意换行符):

[{"foo": "bar"}, {"bar": 
"foo"}]