3

我需要从大约 70.000 个(子)键/对象的 JSON 格式文本中获取主键(设备)它看起来像这样:

{
   "1":{...........}
   "4":{...........}
   "9":{...........}
}

我需要得到“1”、“4”和“9”。但是我现在这样做的方式需要大约 2 分钟来解析文本

json = json.loads(response.text) #this takes so long!
devices = json.keys()

因为我在树莓派上运行它!

有没有更好的办法?

编辑: 我从运行在服务器上的 JSON API 接收数据:

http://.../ZWaveAPI/Run/devices #this is an array

编辑3:

最终工作代码:(运行 2-5 秒!:)

import ijson.backends.python as ijson
import urllib

parser = ijson.parse(urllib.urlopen("http://.../ZWaveAPI/Run/devices"))
list = []
for prefix,event,value in parser:
    if event == "map_key" and len(prefix) == 0:
        list.append(value)
return list
4

2 回答 2

5

您可以使用面向流的迭代 JSON 解析器来完成它,但您需要单独安装它。试一试ijson,它会为遇到的每个 JSON 结构发出事件:

for prefix, event, value in parser:
    if event == 'map_key':
        print value
于 2013-04-04T20:27:02.643 回答
0

您是否尝试过只购买一台设备?对于大多数 RESTful Web 服务,如果您看到这样的 URL:

“h ttp://.../ZWaveAPI/Run/devices”

您有可能通过以下方式获得单个设备:

“h ttp://.../ZWaveAPI/Run/devices/1”

如果它有效,它应该会大大减少你必须下载和解析的数据量。

于 2013-04-05T00:33:19.093 回答