2013-04-04 3 views
2

мне нужно, чтобы получить основные ключи (устройства) из JSON форматированный текст с ключами вокруг 70,000 (суб)/объекты Это выглядит следующим образом:ключи Python JSON без разбора

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

И мне нужно получите «1», «4» и «9». Но то, как я это делаю сейчас это занимает около 2 минут, чтобы разобрать текст с

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

, потому что я бегу это на Raspberry Pi!

Есть ли лучший способ?

EDIT: Я получаю данные из JSON API работает на сервере с:

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

EDIT3:

конечного рабочего кода: (работает в течение 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 
+0

использовать базу данных и запрашивать только то, что вам нужно, когда вам это нужно? –

+0

Я не могу изменить данные, которые получаю ... Я получаю текст со многими клавишами, и мне нужно получить основные ключи ... Или есть возможность в том, как я получаю данные? (см. «Редактирование») – TeNNoX

ответ

4

Вы можете сделать это с помощью ориентированного на поток итеративного анализатора JSON, bu т вам потребуется установить его отдельно. Попробуйте ijson, он будет излучать события для каждой структуры JSON встречаются:

for prefix, event, value in parser: 
    if event == 'map_key': 
     print value 
+0

Но это будет просто вызывать события, когда он анализирует, он не быстрее или не так ли? – TeNNoX

+0

Это даст вам доступ к промежуточным результатам быстрее, так как вы их получите до того, как все будет загружено. Он также будет использовать гораздо меньше памяти, поскольку вы не будете создавать гигантскую структуру данных, наполненную вещами, которые вы не собираетесь использовать. Это должно быть, по крайней мере, несколько быстрее. – Leopd

+0

@TeNNoX: вам нужно просканировать промежуточные результаты * в любом случае *, чтобы перейти к интересующим вас клавишам. Но с помощью потокового анализатора вам не нужно создавать объекты python для всего набора данных, что ускоряет работу. –

0

Вы пробовали экспериментировать с получением только одного устройства? В большинстве RESTful веб-сервисов, если вы видите URL вроде этого:

"ч TTP: //.../ZWaveAPI/Run/devices"

Скорее всего, вы получите отдельное устройство по :

«ч TTP: //.../ZWaveAPI/Run/devices/1»

Если это работает, это должно значительно уменьшить количество данных, которые вы должны загрузить и разобрать.

+1

Да, но мне нужен действительный список всех файлов. Я не могу опробовать все числа ... Кстати, я сократил время до 3 секунд с помощью ijson, как показано в ** EDIT3 ** – TeNNoX

Смежные вопросы